【问题标题】:how does prototype property of function effects the constructor property of an object?函数的原型属性如何影响对象的构造函数属性?
【发布时间】: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

我的不理解请用真假和解释来回答:

  1. 虽然 js 中的函数也是对象,但是使用 new 关键字prototype 对象创建的对象是唯一可以访问名为 的属性的对象构造函数sonObj.constructor 和 Son.prototype.constructor 是有效的
  2. js 中的函数有一个名为 prototype 的对象,用 new 关键字定义的对象没有,即上面的 sonObj 没有 prototype 即 sonObj.prototype 是“未定义”
  3. 现在 constructor 指向用于制作对象的类?如果是真的那么为什么 sonObj.constructor 给我爸爸课?有人会说 Son 的原型发生了变化,那么 Son.prototype.constructor"instance of Son".constructor 指向同一个对象?
  4. 继承后为什么要写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


【解决方案1】:

虽然js中的函数也是对象,但对象是对象 使用 new 关键字和原型对象创建是唯一的 可以访问名为构造函数的属性

没有。 js 中的大多数对象都具有.constructor 属性,它们从原型继承。同样由{} 创建的普通对象从Object.prototype 继承,它们的.constructor 将指向Object,就像数组从Array.prototype 继承.constructor == Array 或函数从Function.prototype 继承.constructor == Function。它们不一定需要由new 创建。

js中的函数有一个对象 称为原型,用 new 关键字定义的对象没有,即 上面的sonObj没有原型,即sonObj.prototype是 “未定义”

没错。那是how .prototype works

现在构造函数指向以前的类 制作对象?

不一定。 .constructor 是原型上的一个普通属性,它会被实例继承,并且被初始化为原型对象所属的函数。不过,.prototype.constructor 都是可覆盖的。

如果是真的那么为什么sonObj.constructor给我爸爸 上课?

因为您已经用其.constructor 属性不是Son 而是继承值Dad 的对象覆盖了Son.prototype(您已将其更改为new Dad 实例-questionable, btw

有人可能会说,Son 的原型发生了变化,那就是 Son.prototype.constructor 和“儿子的实例”.constructor 指向 同一个对象?

是的。

为什么要写 Son.prototype.constructor=Son 之后 继承?

修复它并使其像您最初预期的那样工作。另见What is the `constructor` property really used for?

【讨论】:

  • .constructor 将指向任何构造对象,无论是ObjectArray 还是myFunc
  • @Mosho:除非没有,比如(new Son).constructor == Dad :-) 我就是这么说的,是的
  • 嗯,你的第一个答案有点误导,这就是我所指的。
  • @Mosho:我现在已经彻底修改了那段。更好?
猜你喜欢
  • 1970-01-01
  • 2010-10-07
  • 2014-01-05
  • 1970-01-01
  • 2018-06-11
  • 2015-03-24
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多