`
yanzhihong23
  • 浏览: 59219 次
  • 性别: 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实现继承机制,首先从基类入手。所有开发者定义的类都可作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击。

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

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

    ECMAScript概述

    原型链是JavaScript实现继承的关键机制。 3. **作用域链与闭包**:在ECMAScript中,变量的作用域决定了其可见性和生命周期。作用域链(Scope Chain)是由当前执行上下文的变量对象组成的链,用于在不同作用域查找...

    ECMAScript 6 第三版

    2. **模块化**:通过`import`和`export`关键字,ES6实现了原生的模块化机制,可以方便地组织和管理代码,避免全局变量污染,提高代码复用性。 3. **箭头函数**:箭头函数提供了一种简洁的函数定义方式,`=>`符号将...

    ECMAScript 6 入门(第三版 )

    类可以定义构造函数、方法,并通过extends关键字实现继承。 4. **模板字符串**:使用反引号(`)创建字符串,可以方便地插入表达式,增强代码可读性,尤其在处理多行字符串时。 5. **解构赋值**:允许从数组或对象中...

    ECMAScript-Edition5-小试

    - **基于原型的继承**:ES5 继续强化了 JavaScript 的原型继承机制。通过使用 `Object.create()` 方法,可以直接将一个对象作为另一个对象的原型,从而实现继承。 - **对象的可扩展性**:ES5 为对象引入了一个内部...

    2018最新高清ECMAScript 6入门

    `extends`关键字用于实现类的继承,`super`关键字用于调用父类的构造函数或方法。 5. **模块化** - `import` 和 `export` 为JavaScript提供了原生的模块系统,使得代码组织更加规范,支持按需加载和静态分析。 6....

    ECMAScript 6 入门(第三版)

    类的继承通过`extends`关键字实现,可以使用`super`关键字调用父类的方法和属性。 5. **解构赋值**:允许从数组或对象中提取数据,将其结构赋值给新的变量,简化了变量的初始化和参数传递。 6. **默认参数**:函数...

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

    二、ECMAScript继承机制的实现 在JavaScript(ECMAScript)中,继承机制是通过多种方式实现的,包括但不限于原型链、构造函数借用、组合继承等。JavaScript的类并非传统意义上的类,而是通过函数来模拟的。当一个...

    besen-master_delphi_inchknf_ECMAScript_

    Delphi提供了异常处理机制来捕获和处理错误,而闭包可以通过匿名函数(lambda)来实现。至于异步编程,Delphi的IOCP模型或第三方库如OmniThreadLibrary可以帮助处理。 总之,将ECMAScript第五版的特性在Delphi环境...

    ECMAScript 6入门 第二版 阮一峰 完整版

    **类与继承**:**ES6通过`class`关键字实现了面向对象编程中的类的概念,虽然实质上仍是基于原型的继承,但语法更加接近传统的面向类的语言。`extends`关键字用于实现类的继承,`super`关键字用来访问父类的构造...

    js中实现多态采用和继承类似的方法.docx

    通过上述代码示例和解析,我们可以看到JavaScript是如何通过继承机制来实现多态特性的。尽管JavaScript不是一种传统意义上的面向对象语言,但它通过灵活的原型链机制提供了强大的多态性和继承能力。这对于构建复杂的...

    浅谈Javascript实现继承的方法

    在实际应用中,根据不同的需求和场景,可以灵活选择合适的继承方式来实现继承机制。Javascript的继承方式不仅限于以上几种,还可以根据特定需求通过各种模式组合创造出新的继承方法。理解这些基本的继承方式对于深入...

    ecmascript1017.zip

    - 使用反引号(`)包裹的字符串,可以方便地插入变量和表达式,通过 `${}` 来实现。 3. **箭头函数**: - 箭头函数(=>)简化了函数的定义,减少了语法糖,其this指向取决于上下文,而不是函数本身。 4. **...

    ECMAScript 6 入门教程

    - `class` 关键字用于定义类,`extends` 关键字实现继承。 6. **模块系统** - `import` 和 `export` 关键字用于模块导入和导出,支持静态链接,增强了代码的组织和复用性。 - 模块可以按需导入,有助于优化代码...

    Ecma-262.rar_ECMA-262_ECMAScript_javascript

    "ECMAScript_javascript"表明此规范与JavaScript语言密切相关,JavaScript是基于ECMAScript实现的一种广泛使用的脚本语言。 ECMAScript规范的每个新版本都会引入新的特性和改进,旨在提升语言的灵活性和功能性。...

    Understanding ECMAScript 6 The Definitive Guide for JavaScript Developers pdf 0分

    5. 继承(Inheritance):ES6通过class关键字进一步扩展了JavaScript的原型继承模型,引入了更传统的面向对象编程继承机制。这使得开发者能够更自然地实现类之间的继承关系。 6. 异步编程(Asynchronous ...

Global site tag (gtag.js) - Google Analytics