js 继承inheritance/extends

本文介绍了JavaScript中的伪类模式,探讨了如何通过构造器函数实现类似面向对象的特性,并讨论了这种模式存在的问题,如缺乏私有环境及构造器函数误用导致的问题。

主要就是《javascript语言精粹》语言精粹中的内容

5.1伪类

Function.prototype.method = function(name,func){ this.prototype[name] = func; return this; }

var
Cat = function(name){ this.name = name; this.saying = "meow"; } Cat.prototype = new Mammal(); Cat.prototype.purr = function(n){ var i,s = ""; for(i = 0 ; i < n ; i+=1){ if(s){ s += "-"; } s += "r"; } return s; } Cat.prototype.get_name = function(){ return this.says() + " " + this.name + " " + this.says(); }
var myCat = new Cat("bubu");
var says = myCat.says();
var purr = myCat.purr(5);
var name = myCat.get_name();

console.log(says , purr , name);
 

伪类模式本意是想向面向对象靠拢,我们可以隐藏一些丑陋的细节,这是通过使用method方法定义一个inherits方法来实现的

Function.prototype.method = function(name,func){
    this.prototype[name] = func;
    return this;
}

Function.method('inherits',function(Parent){
    this.prototype = new Parent();
    return this;
})

var Cat = function(name){
    this.name = name;
    this.saying = "meow";
}.
    inherits(Mammal).
        method("purr",function(n){
        var i,s = "";
        for(i = 0 ; i < n ; i+=1){
            if(s){
                s += "-";
            }
            s += "r";
        }
        return s;
    }).
        method("get_name",function(){
            return this.says() + " " + this.name + " " + this.says();
        });

var myCat = new Cat("bubu");
var says = myCat.says();
var purr = myCat.purr(5);
var name = myCat.get_name();

console.log(says , purr , name);

我们现在有了行为像“类”的构造器函数,但是他们可能有着令人惊讶的行为:没有私有环境;所谓的属性都是公开的。无法访问super(父类)的方法

更糟的是,使用构造器函数存在一个严重的危害。如果你在调用构造器函数时忘记在前面加上new 前缀,那么this将不会绑定到一个新对象上。更可悲的是,this将绑定到全局对象上,所以不精没有扩充新对象,反而将破坏全局变量

伪类给不熟悉js的程序员提供了便利,但是它也隐藏了该语言的真实本质。许多复杂的类层次结构产生的原因是静态类型检查的约束。js完全摆脱了那些约束。在基于类的语言中,类的继承是代码重用的唯一方式。js有更好的选择。

 

转载于:https://www.cnblogs.com/della/p/3622527.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值