2016-07-30 30 views
1
Arbeits

HierHinzufügen Eigenschaft Object.prototype Punktnotation nicht wie erwartet

// inherit methods of Date to extend it. 
var extendDate=Date.prototype; 

// add year property to Date.prototype, thus to an instance of Date 
/*extendDate.year={ 
    get: function() { return this.getFullYear(); }, 
    set: function(y) { this.setFullYear(y); } 
};*/ 

Object.defineProperty(extendDate, "year", { 
    get: function() { return this.getFullYear(); }, 
    set: function(y) { this.setFullYear(y); } 
}); 


// test year's getter and setter 
// first, create an instance of Date 
// remember, Date now inherits property year 
var now=new Date(); 
alert(now); 
now.year=2000; 
alert(now); 

Object.defineProperty Verwendung() funktioniert wie erwartet, aber nicht, wenn ich

extendDate.year={ 
     get: function() { return this.getFullYear(); }, 
     set: function(y) { this.setFullYear(y); } 
}; 

JSFiddle verwenden: https://jsfiddle.net/od53se26/1/

Danke.

Antwort

0

Wenn Object.defineProperty() verwenden, können Sie Accessor Deskriptoren bereitstellen, die verwendet werden, wenn eine Eigenschaft Zugriff auf, während in dem kommentierten Code Sie einfach nur ein Objekt auf eine Eigenschaft zuweisen, die Methoden zu haben, geschieht.

var obj = Object.prototype; 

obj.awesomeProp = { 
    get: function() { return 'chicken satay'; } 
}; 
// logs the whole awesomeProp object 
console.log(obj.awesomeProp); 
// logs "function() { return 'chicken satay'; }" 
console.log(obj.awesomeProp.get); 

Object.defineProperty(obj, 'anotherProp', { 
    get: function() { return 'chicken soup'; } 
}); 
// logs "chicken soup" 
console.log(obj.anotherProp); 
// logs *undefined* 
console.log(obj.anotherProp.get); 
0

Danke für die Klarstellung. Nur ein weiterer Punkt: Da Object.prototype um zwei zusätzliche Eigenschaften erweitert wird (awesomeProp und anotherProp), erbt jede Objektinstanz auch diese Eigenschaften.

Jsfiddle https://jsfiddle.net/1nxtmeyu/

var obj = Object.prototype; 

obj.awesomeProp = { 
    get: function() { return 'chicken satay'; } 
}; 

Object.defineProperty(obj, 'anotherProp', { 
    get: function() { return 'chicken soup'; } 
}); 

var AnyObj=function() {}; 
// AnyObj inherited awesomeProp and anotherProp 
var child=new AnyObj(); 
alert(child.anotherProp);  // alerts chicken soup 
alert(child.awesomeProp.get);  // alerts function() { return 'chicken satay'; } 

Kind erbt awesomeProp und anotherProp von Object.prototype wie durch die Warnungen angezeigt.