javascript - 关于构造函数继承的缺点的一个疑问
巴扎黑
巴扎黑 2017-04-10 18:08:44
[JavaScript讨论组]
function  SuperType(name){
    this.colors=["red","blue","green"];
    this.name=name;
    }
function SubType(name){
    SuperType.call(this,name);//给SubType设置了name属性,并传递参数来初始化属性值
    }
var x1=new SubType("cc");
var x2=new SubType();
alert(x1.name);//cc  
x1.colors.push("black");
alert(x2.colors);//["red","blue","green"];

书上说这个构造函数继承有一个缺点是:方法都在构造函数中定义,无法复用,不太理解什么叫无法复用,求解惑。

巴扎黑
巴扎黑

全部回复(1)
黄舟

书中这句话和这段代码其实没什么关系,代码是演示通过Super.call()借用构造函数继承的方法;

这句话要结合上一节的创建对象——构造函数模式来看,假设SuperType 在构造函数里定义了一个方法:

function  SuperType(name){
    this.colors=["red","blue","green"];
    this.name=name;
    this.sayName = function() {
        console.log(this.name);
    };
}

那么每一次调用new SuperType,就会在实例内部定义一次这个方法——你定义1000个实例,就会定义1000次这个方法;对于color 和name 这两个变量来说,这无可厚非;但实例方法大多数是相同的,所以这里更推荐把方法定义在SuperType.prototype上,这样每个实例构造出来就自动继承这个方法,不用在构造函数里一次次地写。

同理,假如你把方法定义在SuperType构造函数里(如上),那么借用SuperType 继承的时候:

function SubType(name){
    SuperType.call(this,name);
}

其实等价于:

function SubType(name) {
    this.colors=["red","blue","green"];
    this.name=name;
    this.sayName = function() {
        console.log(this.name);
    };
}

这不也会把SuperType函数里这个sayName方法一次次重复定义吗?

那么如果方法定义在SuperType.prototype 里,SubType怎么继承呢?你继续看书吧。

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

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