【发布时间】:2014-07-12 08:01:40
【问题描述】:
我有下面的代码sn-p
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 中的函数也是对象,但是使用 new 关键字 和 prototype 对象创建的对象是唯一可以访问名为 的属性的对象构造函数 即 sonObj.constructor 和 Son.prototype.constructor 是有效的
- js 中的函数有一个名为 prototype 的对象,用 new 关键字定义的对象没有,即上面的 sonObj 没有 prototype 即 sonObj.prototype 是“未定义”
- 现在 constructor 指向用于制作对象的类?如果是真的那么为什么 sonObj.constructor 给我爸爸课?有人会说 Son 的原型发生了变化,那么 Son.prototype.constructor 和 "instance of Son".constructor 指向同一个对象?
- 继承后为什么要写Son.prototype.constructor=Son?
【问题讨论】:
-
您是否阅读了侧边栏中的相关问题?特别是,看起来stackoverflow.com/questions/541204/… 应该可以解决您的大部分问题。
-
我想澄清继承之前和之后发生的事情,这就是为什么我从下面的解释中发布它的原因我可以理解每个 obj 都使用构造函数 obj 的新引用创建,它是 class.prototype.constructor 但如果是类.prototype.constructor 被覆盖,然后在继承之前创建的 obj 将继续指向旧的,这在你给@Barmar 的链接中没有提到
-
您不应该创建 Parent 的实例来设置 Child 使用
Son.prototype = Object.create(Dad.prototype)的继承的原型部分。要继承实例特定成员或在 Child 调用 Parent 构造函数中重新使用 Parent 构造函数代码:Parent.call(this,arguments);重新分配原型不会影响已创建的实例,但改变原型会。有关构造函数和原型的更多信息:stackoverflow.com/a/16063711/1641941
标签: javascript oop