Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数的原型属性如何影响对象的构造函数属性?_Javascript_Oop - Fatal编程技术网

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中的函数也是对象,但是使用新关键字原型对象创建的对象是唯一可以访问名为构造函数的属性的对象,即sonObj.constructor和子.prototype.constructor是有效的
  • js中的函数有一个名为prototype的对象,其中使用new关键字定义的对象没有,即上面的sonObj没有prototypesonObj.prototype是“未定义的”
  • 现在构造函数指向用于生成对象的类?如果是真的,那么为什么sonObj.constructor会给我一个dad类呢?有人可能会说Son的原型发生了变化,然后是Son.prototype.constructor“Son的实例”。constructor指向同一个对象
  • 为什么要在继承之后编写Son.prototype.constructor=Son
  • 虽然js中的函数也是对象,但是 只有使用新关键字和原型对象创建的 有权访问名为构造函数的属性


    不需要。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:我现在已经彻底检查了那一段。更好?