Javascript 函数的原型属性如何影响对象的构造函数属性?
我有下面的代码片段Javascript 函数的原型属性如何影响对象的构造函数属性?,javascript,oop,Javascript,Oop,我有下面的代码片段 function Dad(){ this.name="i am dad"; } function Son(){ this.nameOfChild="child"; } var sonBeforeInheritance= new Son(); alert(sonBeforeInheritance.constructor); //outputs Son class //inheritance done Son.prototype= new Dad();
function Dad(){
this.name="i am dad";
}
function Son(){
this.nameOfChild="child";
}
var sonBeforeInheritance= new Son();
alert(sonBeforeInheritance.constructor); //outputs Son class
//inheritance done
Son.prototype= new Dad();
var sonObj= new Son();
alert(sonObj.constructor); //outputs Dad class
alert(sonBeforeInheritance.constructor); //outputs Son class
我的理解请回答正确/错误并解释:
不需要。js中的大多数对象都有
.constructor
属性,它们从原型继承该属性。另外,由{}
创建的普通对象继承自对象。prototype
及其构造函数将指向对象
,正如数组从数组继承。构造函数==数组
。原型
或函数从函数继承。构造函数==函数
。原型
。它们不一定需要通过new
创建
js中的函数有一个对象
调用了使用new关键字定义的对象没有的原型,即。
上面的sonObj没有原型,即sonObj.prototype是
“未定义”
对。那太好了
现在,构造函数指向用于
制造物体
不一定.constructor
是原型上的一个普通属性,因此实例将继承它,并将其初始化为原型对象所属的函数。不过,.prototype
和.constructor
都是可覆盖的
如果是真的,为什么sonObj.constructor给我爸爸
上课
因为您已经用一个对象覆盖了Son.prototype
,该对象的.constructor
属性不是Son
,而是继承的值Dad
(您已将其更改为新Dad
实例-)
有人可能会说,儿子的原型发生了变化,然后是
构造函数和“子的实例”。构造函数指向
同一个物体
对
为什么我要在后面写Son.prototype.constructor=Son
继承权
修复它,并使它像您最初期望的那样工作。另请参见。您是否阅读了侧边栏中的相关问题?特别地,我想澄清一下继承前后发生了什么这就是为什么我在下面的解释中发布了它我可以理解,创建的每个obj都有对构造函数obj的新引用,即class.prototype.constructor,但是如果class.prototype.constructor被覆盖,那么obj在继承之前创建的将继续指向旧的继承,这在您给@Barmar的链接中没有提到。您不应该创建父对象的实例来设置继承的原型部分供子对象使用Son.prototype=Object.create(Dad.prototype)
。要继承实例特定的成员或在子类中重新使用父类构造函数代码,请调用父类构造函数:Parent.call(这是参数)代码>重新分配原型不会影响已创建的实例,但会对原型进行变异。关于构造函数和原型的更多信息:。构造函数将指向构建对象的任何东西,无论是对象
,数组
,还是myFunc
@Mosho:除非它没有,就像(新儿子)。构造函数==Dad
:-)这就是我说的,yeswell,你的第一个答案有点误导人,这正是我所指的。@Mosho:我现在已经彻底检查了那一段。更好?