继承[第6章-面向对象的程序设计 笔记3]

许多 OO 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在 ECMAScript 中无法实现接口继承。 ECMAScript 只支持实现继承, 而且其实现继承主要是依靠原型链来实现的。

原型链

ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原

型让一个引用类型继承另一个引用类型的属性和方法。

简单回顾一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

那么,假如我们让原型对象等于另一个类型的实例,结果会怎么样呢?

显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。

实现原型链有一种基本模式大致如下:

function SuperType(){

this.property = true;

}

SuperType.prototype.getSuperValue = function(){

return this.property;

};

function SubType(){

this.subproperty = false;

}

//继承了 SuperType

SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function (){

return this.subproperty;

};

var instance = new SubType();

alert(instance.getSuperValue()); //true

以上代码定义了两个类型: SuperType 和 SubType 。每个类型分别有一个属性和一个方法。

主要区别是 SubType 继承了 SuperType ,而继承是通过创建 SuperType 的实例,并将该实例赋给

SubType.prototype 实现的。

实现的本质是重写原型对象,代之以一个新类型的实例。换句话说,原来存在于 SuperType 的实例中的所有属性和方法,现在也存在于 SubType.prototype 中了。在确立了继承关系之后,我们给SubType.prototype 添加了一个方法,这样就在继承了 SuperType 的属性和方法的基础上又添加了一个新方法。

如下所示:

时间: 2024-10-26 03:58:45

继承[第6章-面向对象的程序设计 笔记3]的相关文章

原型模式[第6章-面向对象的程序设计 笔记2]

我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含特定类型的所有实例共享的属性和方法.按照字面意思来理解,那么 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象.(有点类似于java中的类) 因此不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,如下所示: function Person(){ } Person.prototype.name = "Nicholas"; P

javascript对象[第6章-面向对象的程序设计 笔记1]

ECMA-262 把对象定义为: “无序属性的集合, 其属性可以包含基本值. 对象或者函数. ” 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正因为这样(以及其他将要讨论的原因) ,我们可以把 ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 对象 创建自定义对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法,如下所示. var person = new Object

js面向对象的程序设计笔记

chap6:面向对象的程序设计 面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript 中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.ECMA-262 把对象定义为: “无序属性的集合, 其属性可以包含基本值. 对象或者函数. ” 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正因为这样(以及其他将要

第六章 面向对象的程序设计 (3 继承)

6.3 继承 许多OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript 中无法实现接口继承.ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链来实现的. 6.3.1 原型链 ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法.其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.简单回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型

读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计

EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value 前三个值的默认值都为false 举例 Object.defineProperty( person, "name", { writable:false, value:"niko"} ) ; 一旦属性定义为不可配置的,就不能再把它变回可配置的了 读取属性 的特性 var descriptor  = Object.ge

javascript高级程序设计笔记(第6章 面向对象的程序设计)

1.访问器属性: var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return this._year; }, set: function(newValue){ if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book

8.2.2继承 第8章 面向对象编程简介

继承是OOP最重要的特性之一.  OOP--面向对象 任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员.在OOP中,被继承(继承也称为派生)的类称为父类(也称为基类).注意,C#中的对象仅能直接派生于一个基类,当然基类也可以由自己的基类. 继承性可以从一个较一般的基类扩展或创建更多的特定类.例如,考虑一个代表农场家畜的类.这个类叫做Animal,拥有方法如EatFood()或Breed(),我们可以创建一个派生类Cow,支持所有这些方法,它也有自己的方法,如Moo()和Su

【红宝书】第6章.面向对象的程序设计

面向对象(Object-Oriented,OO) 类 6.1理解对象 创建Object的实例,然后添加属性和方法 let person = new Object(); person.name = "AAA"; person.sayName = function() {}; 对象字面量模式 let person = { name: "AAA", sayName: function() {} }; 6.1.1属性类型 用特性(attribute)描述属性(propert

6章 面向对象的程序设计

6.1    理解对象     6.1.1    属性类型     1.    数据属性(ecma-262第五版) 说明:    用于实现JavaScript引擎,JavaScript不能直接访问 [[Configurable]]:    true(默认)或false, 限制以下行为 通过delete删除属性从而重新定义属性: 修改属性的特性: 把属性修改为访问其属性. [[Enumerable]]:    true(默认)或false,限制以下行为 通过for-in循环返回属性: [[Writ