2016-07-30 5 views
1

icipropriété Ajouter à Object.prototype en utilisant la notation de points ne fonctionne pas comme prévu

// 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); 

En utilisant Object.defineProperty() fonctionne comme prévu, mais pas quand j'utilise

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

jsFiddle: https://jsfiddle.net/od53se26/1/

Merci.

Répondre

0

Lorsque vous utilisez Object.defineProperty(), vous fournissez descripteurs accesseurs qui sont utilisés lors de l'accès à une propriété, alors que dans le code commenté vous assignez simplement un objet à une propriété qui se trouve à avoir des méthodes.

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

Merci pour la clarification. Juste un autre point: puisque Object.prototype est augmenté de deux propriétés supplémentaires (awesomeProp et anotherProp), toute instance d'objet hérite également de ces propriétés.

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'; } 

enfant hérite awesomeProp et anotherProp de Object.prototype comme le montrent les alertes.