`
yanzhihong23
  • 浏览: 57737 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ECMAScript 继承机制实现

 
阅读更多

一直没明白call(),所以找个一下资料,终于呢,是理清了,简单点说呢,就俩字“继承”。

 

 

直接上代码了

 

 

function ClassA(sColor) {
    this.color = sColor;
    this.sayColor = function () {
        alert(this.color);
    };
}

 

 

  • 对象冒充 (object masquerading)

function ClassB(sColor, sName) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}
 

 

  原理:使 ClassA 构造函数成为 ClassB 的方法,然后调用它。ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。

 

对象冒充支持多重继承

 

 

  • call()
function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}

 

 

一目了然

 

  • apply()

apply()与call()的区别就在于第二个参数,call是直接传入参数,而apply则是参数数组。

 

 

ClassA.apply(this, new Array(sColor));

 

 如果子类父类的参数顺序一致,也可直接传arguments 。

 

 

ClassA.apply(this, arguments);

 

 

  •  原型链(prototype chaining)

 

function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();
 

直接把 ClassB 的 prototype 属性设置成 ClassA 的实例。

不能传递参数,这在原型链中是标准做法。

 

 

var objB = new ClassB();
alert(objB instanceof ClassA);	//输出 "true"
alert(objB instanceof ClassB);	//输出 "true"
 

 

  • 混合
function ClassA(sColor) {
    this.color = sColor;
}

ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}

ClassB.prototype = new ClassA();

ClassB.prototype.sayName = function () {
    alert(this.name);
};

 怎么来的呢?

 

对象冒充必须使用构造函数方式,原型链不能带参数。那就一起用呗

 

instanceof 依然是true

分享到:
评论

相关推荐

    Javascript 继承机制的实现

    选定基类后,就可以创建它的子类了。是否使用基类完全由你决定。有时,你可能想创建一个不能直接使用的基类,它只是用于给子类提供通用的函数...和其他功能一样,ECMAScript中实现继承的方式不止一种。这是因为JavaScr

    基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解

    我们知道JavaScript是面向对象的脚本语言,那么既然是面向对象,继承一定是必不可少的了。JavaScript的核心是ECMAScript,JavaScript继承机制的实现其实就是ECMAScript继承机制的实现

    JS实现面向对象继承的5种方式分析

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式 1. 使用对象冒充实现继承(该种实现方式可以实现多继承)...

    详解JavaScript基于面向对象之继承

    一、面相对象继承机制  这个实例使用UML很好的解释了继承机制。  说明继承机制最简单的方式是,利用一个经典的例子就是几何形状。实际上,几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边)。圆是...

    JavaScript 常见的继承方式汇总

     在ECMAscript中描述了原型链的概念,并将原型链作为实现继承的主要方法,其基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法。 构造函数和原型还有实例之间的关系:  每个构造函数都有一个原型...

    Javascript数组操作高级心得整理

    3. 继承机制实现 27 (1) 继承的方式 27 (2) 继承方式1—对象冒充 27 (3) 继承方式2—call()方法与apply()方法 28  call()方法 28  apply()方法 28 (4) 继承方式3—原型链(prototype chaining) 29 (5) 继承方式...

    精通Qt4编程(第二版)源代码

    \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \...

    精通qt4编程(源代码)

    \19.1 执行ECMAScript脚本 459 \19.2 QtScript中的信号和槽 460 \19.3 使用JavaScript操作Qt对象 463 \19.4 基于Prototype的继承 467 \19.5 小结 467 \第20章 国际化 468 \20.1 Unicode与字符编码 468 \20.1.1 ...

    Node.js 开发指南.pdf

    1.5.4 标准化——ECMAScript 8 1.5.5 浏览器兼容性问题 9 1.5.6 引擎效率革命和JavaScript的未来 9 1.6 CommonJS 10 1.6.1 服务端JavaScript的重生 10 1.6.2 CommonJS规范与实现 11 1.7 参考资料 12 ...

    Node.js+开发指南

    1.5.4 标准化——ECMAScript 8 1.5.5 浏览器兼容性问题 9 1.5.6 引擎效率革命和JavaScript的未来 9 1.6 CommonJS 10 1.6.1 服务端JavaScript的重生 10 1.6.2 CommonJS规范与实现 11 1.7 参考资料...

    JavaScript高级教程

    1.2 JavaScript 实现..............................................2 1.2.1 ECMAScript 1.2.2 DOM..............................................5 1.2.3 BOM..............................................8 ...

Global site tag (gtag.js) - Google Analytics