一直没明白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 的构造函数中定义的属性和方法。
对象冒充支持多重继承
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()与call()的区别就在于第二个参数,call是直接传入参数,而apply则是参数数组。
ClassA.apply(this, new Array(sColor));
如果子类父类的参数顺序一致,也可直接传arguments 。
ClassA.apply(this, arguments);
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
分享到:
相关推荐
要用ECMAScript实现继承机制,首先从基类入手。所有开发者定义的类都可作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击。
我们知道JavaScript是面向对象的脚本语言,那么既然是面向对象,继承一定是必不可少的了。JavaScript的核心是ECMAScript,JavaScript继承机制的实现其实就是ECMAScript继承机制的实现
原型链是JavaScript实现继承的关键机制。 3. **作用域链与闭包**:在ECMAScript中,变量的作用域决定了其可见性和生命周期。作用域链(Scope Chain)是由当前执行上下文的变量对象组成的链,用于在不同作用域查找...
2. **模块化**:通过`import`和`export`关键字,ES6实现了原生的模块化机制,可以方便地组织和管理代码,避免全局变量污染,提高代码复用性。 3. **箭头函数**:箭头函数提供了一种简洁的函数定义方式,`=>`符号将...
类可以定义构造函数、方法,并通过extends关键字实现继承。 4. **模板字符串**:使用反引号(`)创建字符串,可以方便地插入表达式,增强代码可读性,尤其在处理多行字符串时。 5. **解构赋值**:允许从数组或对象中...
- **基于原型的继承**:ES5 继续强化了 JavaScript 的原型继承机制。通过使用 `Object.create()` 方法,可以直接将一个对象作为另一个对象的原型,从而实现继承。 - **对象的可扩展性**:ES5 为对象引入了一个内部...
`extends`关键字用于实现类的继承,`super`关键字用于调用父类的构造函数或方法。 5. **模块化** - `import` 和 `export` 为JavaScript提供了原生的模块系统,使得代码组织更加规范,支持按需加载和静态分析。 6....
类的继承通过`extends`关键字实现,可以使用`super`关键字调用父类的方法和属性。 5. **解构赋值**:允许从数组或对象中提取数据,将其结构赋值给新的变量,简化了变量的初始化和参数传递。 6. **默认参数**:函数...
二、ECMAScript继承机制的实现 在JavaScript(ECMAScript)中,继承机制是通过多种方式实现的,包括但不限于原型链、构造函数借用、组合继承等。JavaScript的类并非传统意义上的类,而是通过函数来模拟的。当一个...
Delphi提供了异常处理机制来捕获和处理错误,而闭包可以通过匿名函数(lambda)来实现。至于异步编程,Delphi的IOCP模型或第三方库如OmniThreadLibrary可以帮助处理。 总之,将ECMAScript第五版的特性在Delphi环境...
**类与继承**:**ES6通过`class`关键字实现了面向对象编程中的类的概念,虽然实质上仍是基于原型的继承,但语法更加接近传统的面向类的语言。`extends`关键字用于实现类的继承,`super`关键字用来访问父类的构造...
通过上述代码示例和解析,我们可以看到JavaScript是如何通过继承机制来实现多态特性的。尽管JavaScript不是一种传统意义上的面向对象语言,但它通过灵活的原型链机制提供了强大的多态性和继承能力。这对于构建复杂的...
在实际应用中,根据不同的需求和场景,可以灵活选择合适的继承方式来实现继承机制。Javascript的继承方式不仅限于以上几种,还可以根据特定需求通过各种模式组合创造出新的继承方法。理解这些基本的继承方式对于深入...
- 使用反引号(`)包裹的字符串,可以方便地插入变量和表达式,通过 `${}` 来实现。 3. **箭头函数**: - 箭头函数(=>)简化了函数的定义,减少了语法糖,其this指向取决于上下文,而不是函数本身。 4. **...
- `class` 关键字用于定义类,`extends` 关键字实现继承。 6. **模块系统** - `import` 和 `export` 关键字用于模块导入和导出,支持静态链接,增强了代码的组织和复用性。 - 模块可以按需导入,有助于优化代码...
"ECMAScript_javascript"表明此规范与JavaScript语言密切相关,JavaScript是基于ECMAScript实现的一种广泛使用的脚本语言。 ECMAScript规范的每个新版本都会引入新的特性和改进,旨在提升语言的灵活性和功能性。...
5. 继承(Inheritance):ES6通过class关键字进一步扩展了JavaScript的原型继承模型,引入了更传统的面向对象编程继承机制。这使得开发者能够更自然地实现类之间的继承关系。 6. 异步编程(Asynchronous ...