首页 > 解决方案 > 涉及对象和原型的属性继承

问题描述

我是 JS 的新手,在我的一个测试中,我一直试图弄清楚以下代码在属性继承方面是如何工作的。

function doSomething(){}

doSomething.prototype.foo = "bar"; //Add "foo" property to doSomething's prototype
let anInstance = new doSomething();
anInstance.prop = "value"; //Add "prop" property to object "anInstance"
doSomething.prop = "another value"; //Add "prop" property to "doSomething"
let anotherInstance = new doSomething();

console.log(doSomething.prop);
console.log(anInstance);
console.log(anotherInstance.prop);

这是上面脚本在控制台中的输出:

another value

doSomething{prop: "value"}
  prop: "value"
  __proto__:
    foo: "bar"
    constructor: ƒ doSomething()
    __proto__: Object

undefined

如您所见,printingdoSomethingprop属性在添加到它之后会返回 expected another value,但访问anotherInstance的会prop返回undefined

这不anotherInstance应该“继承”这样prop的属性,因为它是在创建它的函数中定义的吗?

提前致谢。

标签: javascriptinheritancepropertiesprototype

解决方案


向函数添加属性与向函数的原型对象添加属性不同。函数的实例继承函数的prototype属性,而不是函数自己的属性:

function doSomething(){}

doSomething.prototype.foo = "bar"; //Add "foo" property to doSomething's prototype

doSomething.prop = "another value"; //Add "prop" property to "doSomething" but no the prototype

let anotherInstance = new doSomething();

// only has foo:
console.log(doSomething.prototype)

// this is the object it will inherit from
// only has foo
console.log(Object.getPrototypeOf(anotherInstance))

//they are the same object:
console.log(doSomething.prototype === Object.getPrototypeOf(anotherInstance))

在上面的代码doSomething.prop中只是函数的一个属性,它在原型继承中没有任何作用。


推荐阅读