Please enable Javascript to view the contents

Js原型

 ·  ☕ 2 分钟

关于Js原型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 例子
function Person() {

}

var person = new Person();

console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true

实例与原型

当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

原型的原型

原型也是一个对象,原型对象就是通过 Object 构造函数生成的

由于实例的 proto 指向构造函数的 prototype ,

所以Person.prototype.proto == Object.prototype

而再往上Object.prototype.proto == null

补充

  1. 关于constructor: 当获取 person.constructor 时,其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时,会从 person 的原型也就是 Person.prototype 中读取,正好原型中有该属性,所以:
    person.constructor === Person.prototype.constructor

  2. 关于__proto__: 绝大部分浏览器都支持这个非标准的方法访问原型,然而它并不存在于 Person.prototype 中,实际上,它是来自于 Object.prototype ,与其说是一个属性,不如说是一个 getter/setter,当使用 obj.proto 时,可以理解成返回了 Object.getPrototypeOf(obj)。

  3. 关于js的“继承”: 继承意味着复制操作,然而 JavaScript 默认并不会复制对象的属性,相反,JavaScript 只是在两个对象之间创建一个关联,这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。

  4. 所有的函数都是 Function 的实例

参考资料:

  1. JavaScript深入之从原型到原型链
分享

Llane00
作者
Llane00
Web Developer