ES5的继承
构造函数、原型和实例的关系:每一个构造函数都有一个原型对象,每一个原型对象都有一个指向构造函数的指针,而每一个实例都包含一个指向原型对象的内部指针,
- 原型链实现继承:
- 基本思想:利用原型让一个引用类型继承另一个类型的属性和方法,即让原型对象等于另一个类型的实例
- 基本模式:
// 构造函数 function Person(name, sex) { this.name = name; this.sex = sex; this.niam= "草拟吗" this.run=function(){ console.log(this.name+"在奔跑") } } // 定义Person的原型,原型中的属性可以被自定义对象引用 Person.prototype = { getName: function() { return this.name; }, getSex: function() { return this.sex; } } Subperson.prototype = new Person() function Subperson(name, sex, color){ this.color = color this.niam= "你阿妈" this.run=function(){ console.log(this.name+"---"+this.color+"还活蹦乱跳") } } let sub = new Subperson("小李","男","黄色的"); console.log(sub.getName()) sub.run() console.log(sub.niam)
输出:
$ node es5继承.js
undefined
undefined---黄色的还活蹦乱跳
你阿妈
- 最终总结:Sub指向Subperson的原型,Subperson的原型又指向Person的原型
-
注意事项:
-
别忘记默认的原型,所有的引用类型都继承自Object,所有函数的默认原型都是Object的实例,因此默认原型里都有一个指针,指向object.prototype
-
谨慎地定义方法,给原型添加方法的代码一定要放在替换原型的语句之后,不能使用对象字面量添加原型方法,这样会重写原型链
-
-
原型链继承的问题
-
最主要的问题来自包含引用类型值的原型,它会被所有实例共享
-
第二个问题是,创造子类型的实例时,不能向超类型的构造函数中传递参数
-
-
网友评论