javascript - 原型对象的constructor
大家讲道理
大家讲道理 2017-04-11 11:46:51
[JavaScript讨论组]
function Super(){
    this.name = "this is super";
}

Super.prototype = {
    say:function(){
        console.log(this.name);
    }
}

function Sub(){
    this.name = "this is sub";
}

Sub.prototype = new Super();

var o = new Sub();
o.say(); //this is sub

实例 o 的原型对象的constructor是Super,那么 this.name 应该是Super的构造函数。但是输出是 this is sub

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
伊谢尔伦

方法是从原型链中继承来的没错。然而方法体中的this是什么,与这个方法来自哪里没有关系,而是跟方法调用方式有关。你是用o调用的,所以this就是o,就是你new出来的Sub实例。

所以this.name首先是到你的o上面去找,找不到再沿原型链向上查找。

黄舟

o->Sub->Super
你要是不在Sub构造函数里面加上

this.name = "this is sub";

那就能得到 this is super.
翻看一下js 原型链的知识- -

巴扎黑

无论 o.say()say()方法是从哪里继承下来的
其函数内部的指令肯定是 console.log(this.name);

这里的这句命令,会被带回到调用者那里。
this也会指向 调用者 o
此时 o根据原型链最近的方法调用了say函数
所以会输出 "this is sub"

PHP中文网

@linkFly

var o = new Sub(); // 之前 Sub.prototype已经修改了,很疑惑构造函数是Sub。
Sub.prototype.constructor === Sub //false
new Sub() 执行的构造函数 不根据Sub.prototype.constructor 的指向么?
o 对象的constructor属性会默认调用 Sub.prototype.constructor 的构造函数。

 翻阅了相关资料, new Sub() 构造函数为Sub,但是Sub.prototype.constructor 的指向不修改会造成什么问题呢? 这点不是很清楚。之前一直认为 prototype.constructor 的指向就是构造函数。


热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号