function Foo () { this.name = "name" this.age = 18 } Foo.prototype.sayHi = function () { console.log('hello') } var foo = new Foo() foo.name // name foo.age // 18 foo.sayHi() // hello
每一个构造函数都有一个prototype
属性,这个属性指向原型对象
,使用构造函数建立实例对象后,这个prototype
指向的原型对象就是实例的原型对象.prototype 是函数才会有的属性
git
除了 null 以外,每一个对象都拥有一个隐藏的__proto__
属性,指向实例的原型对象.能够用 foo.__proto__
或者 Object.getPrototypeOf(foo)
来访问.github
实际上构造函数的prototype
属性与实例对象的__proto__
属性指向的是同一个原型对象.函数
foo.__proto__ === Foo.prototype // true
每一个原型对象都有一个constructor
属性指向关联的构造函数post
Foo.prototype.constructor === Foo // true
每一个对象都会从原型继承属性this
根据所述可绘制:spa
function Foo () {} Foo.prototype.name = "Ann" var foo = new Foo() foo.name = "ken" console.log(foo.name) // Ken delete foo.name console.log(foo.name) // Ann
当读取实例对象的属性时,先在实例对象中查找,若是找不到,就会到实例关联的原型对象
中去找,若是原型对象中找不到,就到原型的原型对象
中找,一直到最顶层为止..net
原型也是一个对象
,那么就能够使用最原始的方法建立:prototype
var obj = new Object() obj.name = "Ann" console.log(obj.name) // Ann
原型对象就是经过 Object 构造函数建立出来的,那么原型对象就能够经过__proto__属性访问到:3d
Object.prototype 的原型是什么呢? 答案是 null
,null 表示没有对象,此处不该该有值
code
console.log(Object.prototype.__proto__ ) // null
那是什么建立了 Object()这个构造函数呢?
看图:
原型链就是图中的蓝色关联