ekk*_*kis 3 javascript prototype properties
我有以下代码:
Object.defineProperty(Object.prototype, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Object.json' }
});
function Body() {
return 1
}
Object.defineProperty(Body.prototype, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Body.json' }
});
console.log(Body.json())
Run Code Online (Sandbox Code Playgroud)
当我运行时,我得到了一个意想不到的结果:
对象.json
我认为函数是一个对象,在最松散的意义上(因为typeof将返回不同的值),因此,函数可以从对象继承,但是如果函数是从对象派生的,我希望它的属性覆盖或隐藏基类的那些。然而,结果显示并非如此
这怎么可能,我怎样才能获得函数上定义的属性来覆盖对象上定义的属性?
当您调用 时Body.json(),您不是在调用json()的“实例” Body,而是调用Body从Object原型继承的自身。
如果您自己定义属性Body,则在评估您的Body.json()调用时它将优先:
Object.defineProperty(Object.prototype, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Object.json' }
});
function Body() {
return 1
}
Object.defineProperty(Body, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Body.json' }
});
console.log(Body.json()); // "Body.json"Run Code Online (Sandbox Code Playgroud)
或者,如果您在Body原型上定义属性并在 的实例上调用方法Body,您也将获得预期的结果:
Object.defineProperty(Object.prototype, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Object.json' }
});
function Body() {
return 1
}
Object.defineProperty(Body.prototype, 'json', {
configurable: true, enumerable: false, writable: true,
value: function() { return 'Body.json' }
});
console.log(new Body().json()); // "Body.json"Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34 次 |
| 最近记录: |