JavaScript中的继承链
继承链
类别 | 备注 | constructor | prototype | __poroto__ |
---|---|---|---|---|
(构造)函数 | 函数即对象 | 指向Function | 指向一个constructor为自身的空对象 | |
对象 | 指向创建该对象的构造函数 | 源于创建该对象的构造函数的显式原型 | ||
Function | 是所有构造器的源头 | 指向自身 | 对象的constructor指向自身 | |
Object | Object.prototype 是所有原型的源头 | 指向Function | 是一个constructor指向自身的空对象 |
参考于:
面向对象的继承
基于对象的原型实现
1
object.__proto__ = obj
指向一个对象
基于构造函数的原型实现
1
Object.prototype
指向一个空对象
继承常见的几种方式
- 原型链继承: 原型与对象继承; 只继承于原型
问题:- 实际上并不是真正的继承, 其实是多个构造函数之间共享一个对象(属性和方法)
- 创建子类的对象时, 不能向父级的构造函数传递任何参数。
- 原型式继承
- 借助构造函数: apply() 或 call() 方法
问题: this 的传递 - 组合方式继承: 原型链 + 构造函数
面向对象
对象
创建对象的方式
构造函数方式
1
var obj = new Object()
直接量方式
1
2
3
4
5
6var obj = {
name: "lilei",
sayMe: function () {
console.log("this is lilei");
}
}
构造器(constructor)
对象的构造器都是指向创建该对象的构造函数。例如以下示例代码:
1 | function Foo() {} |
上述示例代码中的 foo 对象的构造器就是 Foo。
隐式原型(__proto__)
对象的隐式原型与创建该对象的构造函数的显式原型是指向同一个对象。
1 | function Foo() {} |
函数
函数创建方式
直接量方式
1
var fun = function(){}
与 JavaScript 中的变量是存在关系,例如以下示例代码:
1
2
3
4var fun = function(){}
var fun = 'this is text'
console.log(fun) // 'this is text'上述示例代码存在覆盖问题。
初始化器方式
1
function fun(){}
构造函数方式
1
var fun = new Function()
上述示例代码说明函数是一个 Function 类型的对象。
函数的特性
- 函数可能与变量之间存在关系(直接量方式定义函数时)
- 函数与构造函数允许同时存在的
- 函数是一个 Function 类型的对象
显式原型(prototype)
构造函数的显式原型与利用该构造函数所创建对象的隐式原型是指向同一个对象。
构造器(constructor)
函数的构造器就是 Function。
1 | function fun(){} |
隐式原型(__proto__)
函数的隐式原型与 Function 的显式原型是指向同一个对象。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小康博客!
评论
TwikooWaline