1.JavaScript 中每一个对象都拥有原型链(__proto__)指向其构造函数的原型( prototype )
var a = {}
a.__proto__ === Object.prototype // true
function Person () {}
Person.__proto__ === Function.prototype // true
var p = new Person()
p.__proto__ === Person.prototype // true
2.JavaScript 中每一个函数都拥有原型( prototype ),原型也是一个对象,这个对象包括:原型链、原型方法(属性)、函数构造,同理它的原型链指向其构造函数的原型
function Person () {}
Person.prototype.getName = function () {}
Object.getOwnPropertyNames(Person.prototype) // ["constructor", "getName"]
Person.prototype.__proto__ === Object.prototype // true
3.当访问一个函数上的属性时,先尝试访问自身上的属性,再尝试访问其原型上的属性
。当访问一个对象上的属性时,先尝试访问自身上的属性,再通过原型链尝试访问其构造函数原型上的属性
。如果没有则通过原型上的原型链,继续向上查找,直到访问 Object.prototype 上的属性,如果还是没有,因为 Object.prototype 是一个没有 __proto__ 的对象,则查询到此为止,返回 undefined。
function Person () {}
Person.getName = function () {
console.log('Person1')
}
Person.prototype.getName = function () {
console.log('Person2')
}
var p = new Person()
Person.getName() // Person1
p.getName() // Person2
console.log(typeof p.getClass) // undefined
JavaScript 函数通过原型和原型链实现继承
function superA (name) {
this.name = name
}
superA.prototype.getName = function () {
console.log(this.name)
}
function subA (name) {
superA.call(this, name) // 继承属性
}
subA.prototype = new superA() // 继承方法
var a1 = new subA('xiaomuchen')
a1.getName() // xiaomuchen
上述代码,描述了一个函数的经典继承,其工作原理是这样的: