javascript - 关于新类继承父类的问题
阿神
阿神 2017-04-10 15:45:49
[JavaScript讨论组]

有一个自己创建的新类 newClass, 还有一个需要继承的父类 supClass。
然后 newClass.prototype= new supClass();
新类就能继承父类的所有方法和成员变量了。为什么?
以前写过

(function($){
    var newClass=function(){
    this.a="aaaa";
    this.b="bbbb";
    //一些成员变量
    this.count();
    //执行自己定义的函数
    }
    newclass.prototype={
        cout:function(){
        return this.a+this.b;
        }
    }
   window[newClass]=newClass;
})(jQuery);

是不是newClass.prototype= new supClass();让新类的原型作为父类的this获得所有方法以及变量?

阿神
阿神

闭关修行中......

全部回复(4)
阿神

js 里的继承实现直接确实有点麻烦,所以现在我都懒得写继承,直接用 TypeScript 翻译出来就好了

传送门 TypeScript 在线翻译

class SuperClass {
}
class SubClass extends SuperClass {
    
}

翻译出来

var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var SuperClass = (function () {
    function SuperClass() {
    }
    return SuperClass;
})();
var SubClass = (function (_super) {
    __extends(SubClass, _super);
    function SubClass() {
        _super.apply(this, arguments);
    }
    return SubClass;
})(SuperClass);
天蓬老师

能看到这段代码吗?
newclass.prototype就是一个对象啊,

newclass.prototype={
    cout:function(){
    return this.a+this.b;
    }
}

而对象可以通过字面量的方式创建,如上代码所示
还可以通过new操作符的方式,例如
newClass.prototype= new supClass();

现在newClass的实例对象的原型为new supClass()产生的对象,也就是newclass.prototype
new supClass()产生的对象的原型为supClass.prototype

怪我咯

Javascript中的继承是通过原型链来完成的。
当一个构造函数(楼主指的是类)建成后,会默认有个prototype属性,这个属性是个指针,指向一个对象,这个对象就是构造函数的原型对象,我们可以在这个原型对象上扩充属性和方法,让new出来的实例可以共享这些属性和方法。

  1. new supClass()这个操作后,会在堆空间中开辟一快空间,返回一个实例的栈地址

  2. newClass.prototype= new supClass(),让后把这个实例的地址赋给prototype属性

  3. 这样通过new newClass()出来的实例便会共享new supClass中的实例和方法,达到继承的作用。

详细参考《Javascript高级程序设计(第三版)》6.2.3节-原型模式。

迷茫

new操作符具体做了什么?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

代码表示

//var obj = new Base();
var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

newClass.prototype = new supClass()和上面等同

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

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