原型
对象的 [[Prototype]] 属性(对象的原型)
在js中,对象(除null)都有一个原型的属性(隐式原型),可以通过 Object.getPrototypeOf()
来获取,或者可以通过 __proto__
来获取,因为不能直接通过对象点属性名的方式获取对应的属性,所以对象的原型我们一般称为隐式原型
对象点__proto__获取属性的方法是浏览器自己实现的,规范标准中没有此方法
// 字面量构建 也是在调用 Object的构造函数来构建
// var obj = {}
var obj = new Object()
// 查看
//console.log(Object.getPrototypeOf(obj))
//console.log(obj.__proto__)
函数的prototype 属性(函数的原型)
在js中,函数都有一个prototype的属性(显式原型),可以通过Function.prototype
来获取, 因为函数可以直接通过点属性名的方式获取到该属性,所以称为显式原型,一般称为原型
function foo() {}
console.log(foo.prototype)
函数也是对象,所以函数也有隐式原型
function foo() {}
console.log(foo.__proto__)
原型之间的关系
对象(函数)的隐式原型(__proto__
)指向其构造函数的显示原型(prototype
)
// var obj1 = { } //字面量创建对象是调用构造函数创建对象的简写方式(语法糖)
var obj1 = new Object()
// 对象的隐式原型,指向其构造函数的原型
console.log(obj1.__proto__ === Object.prototype) // true
// obj1.__proto__ 是个对象,所以可以继续获取他的__proto__
// Object 构造函数(习惯称为类)的prototype 也是个对象,所以可以继续获取他的__proto__
// Object 函数(类)的prototype的__proto__ 指向null
console.log(typeof(obj1.__proto__)) // object
console.log(typeof(Object.prototype)) // object
console.log(obj1.__proto__.__proto__) // null
console.log(Object.prototype.__proto__) // null
// 函数的隐式原型 __proto__ 指向其构造函数的原型
// Object() 函数的构造函数是 Function
console.log(Object.__proto__) // { }
console.log(Object.__proto__ === Function.prototype) // true
Function的__proto__
和prototype
是相同的,指向同一内存地址,Function是最顶层的函数
console.log(Function.__proto__ === Function.prototype) // true
原型对象
原型对象至少包含2个属性,constructor
和 __proto__
和原型上的其他属性
- constructor 指向其构造函数
- proto 指向其构造函数的原型
- 其他属性,自己添加的属性
// 给 Object 原型添加 id 属性
Object.prototype.id = '001'
原型链
MDN继承与原型链
实例对象,如果在自身上找不到相应的属性,就会向他的父类原型去寻找,父类找不继续向上寻找,直到找到Object原型终止,如此就形成了一个链条
var obj2 = { name: '张三'}
console.log(obj2.name) // 张三
console.log(obj2.id) // undefined
// 属性寻找流程
// name => 自身,找到返回
// id =》 自身 => Object.prototype(obj2.__proto__) => Object.prototype.__proto__(这个值是null,到达终点) =》 没有找到返回 undefined
Object.prototype.id = '001'
console.log(obj2.name) // 张三
console.log(obj2.id) // 001
// 属性寻找流程
// name => 自身,找到返回
// id =》 自身 => Object.prototype(obj2.__proto__) => Object.prototype.id =》 找到值,返回