JS的继承

摘要:
继承的实际应用还不太清楚,所以我们先来谈谈JS中继承的实现。作为一种基于原型的语言,类继承也可以被JS模仿。首先声明父函数Person{this.name=name;this.age=age;}Person.pr原型.sayHello=函数(){console.log;};继承是一个稍微复杂一些的函数程序员{Person.apply;//修改this.work=work;}父构造函数Programmer的。prototype=newPerson();编程器.原型。constructor=程序员;Programmer.product.product=函数(){console.log;};varp=新程序员;p、 sayHello();//helloconsole。日志;//Jay,注意这不是一个继承的属性,而是p自身的一个属性Prototype指向父Person的实例对象。当访问子类Programmer实例中的成员时,如果找不到成员,他们将在这个Person实例对象中找到它们。如果他们找不到他们,他们会在Person.prototype中找到他们。这相当于人为地设置一个原型链,以达到继承的效果。

对于继承的实际运用还没有很好的理解,这里就先说说JS中继承的实现。

类式继承

作为基于原型的语言,JS也可以模仿类式继承。首先声明一个父类

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHello = function() {
    console.log("hello");
};

继承就显得复杂一点

function Programmer(name, age, work) {
    Person.apply(this, arguments);    //修正父类构造函数的this
    this.work = work;
}
Programmer.prototype = new Person();
Programmer.prototype.constructor = Programmer;
Programmer.prototype.program = function() {
    console.log("coding");
};

var p = new Programmer("jay", 26, "javascript");
p.sayHello(); //hello
console.log(p.name); //jay 注意这个不是继承属性,而是p本身的属性哦

把Programmer.prototype指向父类Person的一个实例对象,那么在子类Programmer的实例中访问成员时,如果找不到,就会去这个Person实例对象里找,还没有就到Person.prototype里找,相当于人为的设置了一条原型链来达到继承的效果。

只要不把Programmer.prototype重写,Programmer的所有实例的原型对象共享同一个对象,即Person实例。我们仍然可以通过修改原型来达到修改所有实例的效果。

有时父类的构造函数很庞大,里面有很多复杂的或我们不需要的操作,我们想要避免创建父类的实例,改进的方法是借用一个空的构造函数作为中间量来链接原型链,我们把整个过程包装到一个函数里

function inherit(subClass, superClass) {
    var F = function() {};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;
subClass.superproto = superClass.prototype; //增加一个自定义属性superproto,这样我们可以通过这个属性引用到父类构造函数 }
function Programmer(name, age, work) {
    Programmer.superproto.constructor.apply(this, arguments);    //等价于Person.apply(this, arguments),这样就避免了在子类的声明中固化父类构造函数名称
    this.work = work;
}
inherit(Programmer, Person);
Programmer.prototype.program = function() {
    console.log("coding");
};

注意到,作为一个中间量,我们可以只创建一个F然后重用它,因此inherit可以这样改进一下

var inherit = (function() {
    var F = function() {};
    return function(subClass, superClass) {
        F.prototype = superClass.prototype;
        subClass.prototype = new F();
        subClass.prototype.constructor = subClass;
        subClass.superproto = superClass.prototype;
    };
})();

掺元类(Mixin)

这是一种代码重用的方法而不是严格的继承。其做法大体是,先创建一个包含各种公用方法的类,即掺元类,然后用它去扩充其它类。掺元类一般不会实例化也不直接调用,其目的就是扩充其它类,提供自己的方法。

function augment(destClass, srcClass) {
    for (method in srcClass.prototype) {
        if (!destClass.prototype[method]) {
            destClass.prototype[method] = srcClass.prototype[method];
        }
    }
}

扩充多个掺元类,变相的多继承

function augment(destClass /*, a number of srcClasses */) {
    var classes = Array.prototype.splice.call(arguments, 1);
    for (var i = 0, len = classes.length; i < len; i++) {
        var srcClass = classes[i];
        for (method in srcClass.prototype) {
            if (!destClass.prototype[method]) {
                destClass.prototype[method] = srcClass.prototype[method];
            }
        }
    }
}

参考:http://blog.csdn.net/pigpigpig4587/article/details/25152031

http://www.cnblogs.com/snandy/archive/2013/05/24/3086663.html

免责声明:文章转载自《JS的继承》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇皇宫看守 树形DPPHP脚本执行超时的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kindeditor在线编辑器的使用心得

1、如何声明引用? <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"/> <title>kindeditor在线编辑器的使用心得</title> <!--添加kindeditor的引用--> <scr...

JS控制SVG缩放+鼠标控制事件

话不多说,直接上代码吧,不行你砍我。。。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js控制SVG缩放</title> </head> <body>...

JS无限添加HTML到指定位置

用JS把HTML添加到指定位置有两种写法,一种是用字符串,一种是用javascript中的方法 第一种: 用字符串写 <h2>利用JS无限添加一个相同部分</h2> <h5>第一种写法</h5> <%--有多少个相同的这里面的值就是几--%>...

JS倒计时,不会重复执行

直接上代码,亲自测试了的,没问题咯 第一种是按钮上直接显示倒计时, <html> <head> <title>点击获取验证码按钮后按钮变灰,倒计时一段时间后又可重复点击</title> <script type="text/javascript" src="http://apps.bdimg.co...

XPO 学习资料(转摘)

Dev 出品的XPO是一个O/R Mapping框架,虽然是商业软件,非开源,但提供了源码。况且Dev的产品一向以精品为主,值得好好研究一下(我不是Dev的代理)。 于是在学习过程中做个摘要。   一、一个持久类(Persistent Class)一般来说映射为一个表类型,该表的每一条纪录即一个持久类的实例。 持久类继承自XPObject或者XPBaseO...

浏览器、HTML、css 面试题

1.什么是盒模型 盒模型(内容(content),内边距(padding),边框(border),外边距(margin)),值得注意的是,块级元素可以设置宽高,内边距,边框,外边距 行内元素宽高自动,并排显示。 2.行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别? CSS规范规定,每个元素都有display属性,确...