

JavaScript 构造函数的继承
source link: http://www.cnblogs.com/earthZhang/p/12346480.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JavaScript 构造函数的继承
在上一篇 文章 中讲述了 JS 对象、构造函数以及原型模式,这篇文章来讨论下 JavaScript 的继承
继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在 ECMAScript 中无法实现接口继承。ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链来实现的。
一、使用 call 或 apply
假如有一个 "人" 对象,还有一个 "学生" 对象。
function Person(name, age) { this.name = name this.age = age } function Student(subject) { this.subject = "语文" }
我们怎样才能使 "人" 对象继承 "学生" 对象的属性或方法呢。第一种方法,也是最简单的方法,使用 call 或 apply 来改变 this 指向使其调用对象的属性或方法。
function Person(name, age) { this.name = name this.age = age Student.call(this, name, age) } var person1 = new Person("张三", "18") console.log(person1.subject) // 语文
二、prototype
第二种方法是使用 prototype 属性。也就是说使用 "人" 的 prototype(原型) 对象指向 Student 的实例对象,那么所有 "人" 的实例,就能继承 "学生"了。
1、先将 Person 的 prototype 对象指向一个 Student 对象的实例
Person.prototype = new Student() // 等于覆盖或者删除了原先的 prototype 对象的值,然后给予一个新值。
2、把 Person 的 prototype 对象的 constructor 属性在指回 Person
Person.prototype.constructor = Person; // 任何一个 prototype 对象都具有一个 constructor 属性,指向它的构造函数。 // 如果不加这下一行代码,Person.prototype.constructor 会指向 Student
3、每一个实例也会有一个 constructor 属性,默认调用 prototype 对象的 constructor 属性。
var person1 = new Student("张三","18"); alert(person1.constructor == Person.prototype.constructor); // true // 因此在运行 Person.prototype = new Student() ,person1.constructor 也指向 constructor // 所以因该手动修改 constructor 的指向
// 总代码 function Person(name, age) { this.name = name this.age = age } function Student(subject) { this.subject = "语文" } Person.prototype = new Student() Person.prototype.constructor = Person; var person1 = new Student("张三","18"); console.log(person1.subject) // 语文
三、继承 prototype(原型)
直接继承原型,我们先修改下 Student 对象的代码,添加原型
function Student(){} Student.prototype.project = "语文"
然后将 Person 的 prototype 对象指向 Student 的 prototype,这样就完成了继承。
Person.prototype = Student.prototype Person.prototype.constructor = Person; var person1 = new Student("张三","18"); console.log(person1.subject) // 语文
这样做虽然效率高,但是下级获取到的权限过重,并且还会修改 constructor 指向
Person.prototype.constructor = Person; // 这一行代码直接把 Student.prototype.constructor 的指向给改了(Person)
四、找中间介
使用空对象,代码如下
var middle = function(){} middle.prototype = Student.prototype; Person.prototype = new middle(); Person.prototype.constructor = Person; console.log(Student.prototype.constructor) // Student
因为 middle 是空对象,所以修改 Person 的 prototype 对象,就不会影响 Student 的 prototype 对象。
Recommend
-
42
一、前言 构造函数缺失漏洞自智能合约产生以来就一直出现,归根到底是由于新进开发者对 solidity 代码结构不熟悉造成的。BUGX.IO团队本次就来介绍一下漏洞的基本原理、表现形式以及对开发者的建议。
-
20
JS里一切皆对象,对象是“无序属性的集合,其属性值可以是数据或函数”。 事实上,所有的对象都是由函数创建的,而常见的对象字面量则只是一种语法糖: // let user = {name: 'paykan', age: 29} ,等同于: let user =...
-
17
构造器和操作符 "new" 常规的 {...} 语法允许创建一个对象。但是我们经常需要创建许多类似的对象,例如多个用户或菜单项等。 这可以使用构造函数和 "new" 操作符来实现。 构...
-
5
python继承中的构造方法和成员方法 2016-03-01 Python的面向对象 无论是Java,还是Python,PHP,JavaScript等等面向对象语言,都肯定有构造方法,构造方...
-
4
java继承中的构造方法和成员方法 2016-02-18 java中所有的类都有构造方法,在每个类被创建时会自动调用构造方法来对对象进行初始化。 super关键字
-
5
JavaScript 函数继承 2016-11-08 JavaScript 是类面向对象的语言,理解原型继承等等非常有必要,而 OOP 优点在于封装、代码重用。如果 JS 代码量少,封装成对象暴露方法调用可行,但如果代码量达到...
-
3
JavaScript 函数、作用域和继承 浏览:1850次 出处信息 关于函数、作用域和继承,可以写的非常多。不过和
-
22
Javascript面向对象编程(三):非函数对象的继承 浏览:1685次 出处信息 昨天,我本来打算,...
-
2
...
-
6
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK