原型与原型链
规则
-
所有的对象都是通过
new 函数
创建的 -
所有的函数都是通过``new Function() 创建的`
-
Function
是一个函数,是直接放到内存里,不是new出来的,所以Function的隐式原型指向自己的原型,Function.prototype
也是一个对象,所以Function.prototype.__proto__
指向Object.prototype
Function.__proto__ === Function.prototype Function.prototype.__proto__ === Object.prototype
-
所有的函数也是对象,可以具有属性
-
所有对象都是引用类型
函数原型
-
所有函数都具有一个
prototype
属性,称为函数原型 -
默认情况下,
prototype
就是一个普通的Object对象 -
默认情况下,
prototype
中有一个属性constructor
,它是一个对象,指向函数本身Object.prototype.constructor === Object // true
隐式原型
-
所有的对象都有一个属性
__proto__
,称为隐式原型 -
实例对象的
__proto__
指向创建该实例构造函数的prototypefunction Person(name){ this.name = name } const p = new Person("法外狂徒") p.__proto__ === Person.prototype // true
-
问:已知实例对象,如何得到创建该对象的构造函数名称?
const name = obj.__prototype__.constructor.name
原型链概念
-
每一个对象都有自己的原型
__proto__
,而原型也是对象,也会有自己的原型,依次类推,形成原型链。 -
Object的原型的隐式原型指向null,即原型链的最顶端
Object.prototype.__proto__ === null
-
对象访问某个属性:就近原则
原型链追溯
// 1. 对于创建的对象
function Person() {}
const p = new Person()
p.__proto__ => Person.prototype
Person.__proto__ => Object.prototype
Object.prototype.__proto__ => null
// 2. 对于创建的函数
function User(){}
User.__proto__ => Function.prototype
Function.prototype.__proto__ => Object.prototype
Object.prototype.__proto__ => null
练习
function User(){}
User.prototype.sayHello = function() {}
const u1 = new User()
const u2 = new User()
console.log(u1.sayHello === u2.sayHello) // true
console.log(User.prototype.constructor) // User
console.log(Function.__proto__ === Function.prototype) // true
console.log(User.__proto__ === Function.prototype) // true
console.log(User.__proto__ === Function.__proto__) // true
console.log(u1.__proto__ === u2.__proto__) // true
console.log(u1.__proto__ === User.__proto__) // false
console.log(Function.__proto__ === Object.__proto__) // true
console.log(Function.prototype.__proto__ === Object.prototype.__proto__) // false
console.log(Function.prototype.__proto__ === Object.prototype) // true
高级API
W3C不推荐直接使用系统成员__proto__
Object.getPrototypeOf(obj)
获取函数的隐式原型
Object.prototype.isPrototypeOf(obj)
判断当前对象是否在指定的原型链上
instanceof
判断函数的原型是否在对象的原型链上
Object.create(obj)
创建一个新对象,其隐式原型指向指定的对象
Object.prototype.hasOwnProperty(属性名)
判断当前对象是否自身具有某个属性,而不是从原型链继承得来