对象与函数原型属性——哪个应该占主导地位?

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将返回不同的值),因此,函数可以从对象继承,但是如果函数是从对象派生的,我希望它的属性覆盖或隐藏基类的那些。然而,结果显示并非如此

这怎么可能,我怎样才能获得函数上定义的属性来覆盖对象上定义的属性?

Rob*_*sen 5

当您调用 时Body.json(),您不是在调用json()的“实例” Body,而是调用BodyObject原型继承的自身。

如果您自己定义属性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)