我正在学习JavaScript中的原型链,并写了一个演示,但我不能理解结果。
这是我的演示:
function A(){}
const c = new A();
A.prototype.sex = "girl";
A.prototype={
name:"q",
age:12
};
console.log(A.prototype.name);
console.log(c.name);
console.log(c.sex);这是输出:
"q"
undefined
"girl"为什么console.log(c.name)输出undefined
发布于 2017-03-10 23:11:38
A是您的构造函数,这意味着当您对新创建的对象进行“初始化”时,您可以在该函数中放入对其执行操作所需的所有内容
在您的情况下,您什么也不做。构造函数有一个prototype属性,它是您将由new A()创建的所有对象都将继承的对象
如果您没有显式地将一个原型设置为您的构造函数,那么您的原型默认情况下是一个空对象。
所以在这一行:const c = new A(); c继承了一个空对象,当你设置:
A.prototype.sex = "girl";你在你的空对象上创建了一个属性性别,并给它分配了"girl“
但是这个对象和你之前的"new“是一样的(相同的引用)。所以c仍然有一个指向它的参考,但是当你这样做的时候:
A.prototype={
name:"q",
age:12
};您更改了A的原型,即更改了A.prototype的引用,但您不再使用new。所以实际上没有任何对象具有
{
name:"q",
age:12
}作为原型。C仍然使用前一个对象(记住是空的)对象作为原型。
但是如果你这样做了:const d = new A(),那么d.name将存在,但d.sex将不存在
发布于 2017-03-10 23:31:26
下面是根据JavaScript spec构造新对象的步骤。
正如您在步骤5和6中看到的,构造对象的内部原型是在构造过程中确定和捕获的。
因此,该对象不维护对"Whatever .prototype value A在任何给定时间拥有的值“的原型引用。它维护了对“执行new A()时A.prototype具有的值”的原型引用。
如果您要在替换原型后再次执行new A(),则此时创建的对象将具有该新原型。
]内部属性为obj的[Extensible]内部属性为true.
)是object,则返回result.
发布于 2017-03-10 22:42:14
1)创建一个空类
2)添加一个静态属性(来自原型)性别
3)你给你的类分配一个新的原型,但是c保留旧的原型。
所以'A‘是最新的,但是'c’仍然是旧的原型,所以名字不存在,但是在更改原型之前设置的性别属性存在,所以你可以找到它。
https://stackoverflow.com/questions/42720787
复制相似问题