javascript - 关于经典继承(constructor stealing)有个疑问

查看:121
本文介绍了javascript - 关于经典继承(constructor stealing)有个疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

看别人的代码:

function SuperClass() {
    this.name = "women";
    this.bra = ["a", "b"];
}
function SubClass() {
    this.subname = "your sister";
    //将SuperClass的作用域赋予当前构造函数,实现继承
    SuperClass.call(this);
}

var sub1 = new SubClass();
sub1.bra.push("c");
console.log(sub1.bra);//["a","b","c"]
var sub2 = new SubClass();
console.log(sub2.bra);//["a","b"]

他的解释如下:
SuperClass.call(this);这一句话的意思是在SubClass的实例(上下文)环境中调用了SuperClass构造函数的初始化工作,这样每一个实例就会有自己的一份bra属性的副本了,互不产生影响了。

我有疑问的地方是:

  1. 为什么用 call 了就能每个实例都有一个副本?我查了一下 call 的作用也只是改变了 this 或者以其他对象身份运行某些方法,但是没有提到这样能够创建副本

谢谢

解决方案

来看看创造实例的时候发生了什么。

//首先SubClass()的this指向sub1实例(中间还有个新创造的空{},先不管这个过程)。
var sub1 = new SubClass();
//开始执行下面的函数
//内部相当于sub1.subname = "your sister",SuperClass.call(sub1);
function SubClass() {
    this.subname = "your sister";
    SuperClass.call(this);
}
//然后因为用call调用了SuperClass,执行SuperClass函数
//因为将SubClass环境中的this传了进去,就相当于sub1.bra = ["a","b"]
function SuperClass() {
    this.name = "women";
    this.bra = ["a", "b"];
}

对于sub2的创造是一样的。
中间相当于sub2.bra=["a","b"]
而不是之前的
sub1.bra指向 XXX.prototype.bra
sub2.bra也指向 XXX.prototype.bra
现在都是各自本身的属性,修改就不会相互影响了。

这篇关于javascript - 关于经典继承(constructor stealing)有个疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆