已经到顶了,为null。 二、所有对象的__proto__都指向其构造器的prototype 上面测试了所有内置构造器及自定义构造器的__proto__,下面再看看所有这些构造器的实例对象的__proto__指向谁? 先看看JavaScript引擎内置构造器 复制代码 代码如下: var obj = {name: "jack"} var arr = [1,2,3] var reg = /hello/g var date = new Date var err = new Error("exception") console.log(obj.__proto__ === Object.prototype) // true console.log(arr.__proto__ === Array.prototype) // true console.log(reg.__proto__ === RegExp.prototype) // true console.log(date.__proto__ === Date.prototype) // true console.log(err.__proto__ === Error.prototype) // true
再看看自定义的构造器,这里定义了一个Person 复制代码 代码如下: function Person(name) { this.name = name } var p = new Person("jack") console.log(p.__proto__ === Person.prototype) // true
p是Person的实例对象,p的内部原型总是指向其构造器Person的prototype。 每个对象都有一个constructor属性,可以获取它的构造器,因此以下打印结果也是恒等的 复制代码 代码如下: function Person(name) { this.name = name } var p = new Person("jack") console.log(p.__proto__ === p.constructor.prototype) // true
上面的Person没有给其原型添加属性或方法,这里给其原型添加一个getName方法 复制代码 代码如下: function Person(name) { this.name = name } // 修改原型 Person.prototype.getName = function() {} var p = new Person("jack") console.log(p.__proto__ === Person.prototype) // true console.log(p.__proto__ === p.constructor.prototype) // true
可以看到p.__proto__与Person.prototype,p.constructor.prototype都是恒等的,即都指向同一个对象。 如果换一种方式设置原型,结果就有些不同了 复制代码 代码如下: function Person(name) { this.name = name } // 重写原型 Person.prototype = { getName: function() {} } var p = new Person("jack") console.log(p.__proto__ === Person.prototype) // true console.log(p.__proto__ === p.constructor.prototype) // false