一、prototype原型
函数有一个默认属性prototype,prototype是一堆对象的集合
在Object这个对象中有一个属性prototype,这个属性指向一个Prototype对象,里面含有一个默认的构造函数指向Object,还含有其他的属性
function fn() {
}
console.log(fn.prototype)
可以看一下prototype中的内容
一脸懵逼
看一下怎么用
function fn() {
}
console.log(fn.prototype)
fn.prototype.name = 'nihao'
fn.prototype.getAge = function () {
return 18
}
var f = new fn()
console.log(f.name) //nihao
console.log(f.getAge()) //18
console.log(fn.name)
好的,至此我们已经知道通过prototype可以动态地(在函数声明完之后)给函数附加属性了
二、隐式原型
每个函数都有一个prototype,每个对象都有一个__proto__
var obj = new Object()
console.log(obj.__proto__)
再看一下Object的prototype属性
var obj = new Object()
console.log(obj.__proto__)
console.log(Object.prototype)
可以看到二者一模一样
原因是obj是由Object这个函数创建的,所以obj.__proto__ ==Object.prototype
即对象的__proto__指向创建他的函数的prototype
那么prototype这个对象的__proto__指向谁呢
Object.prototype的__proto__是个特例,他指向null
如图,f1是由Foo()这个函数new出来的对象,因此f1.__proto__ -> Foo.prototype
Foo.prototype是由Object()这个函数new出来的对象,因此Foo.prototype.__proto__ ->Object.prototype
Object.prototype.__proto__ -> null