🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] > ### 写一个构造函数,生成一个实例 ```js // 构造函数 function Person(name, age) { this.name = name; this.age = age; } // xu 是通过构造函数 new 出的一个实例 var xu = new Person('xu', 19); ``` > ### 构造函数 > `console.log(Person); ` ![](https://box.kancloud.cn/b83b0453d387f6896c48afb4e5282e86_205x56.png) > ### 原型 `console.log(Person.prototype); ` ![](https://box.kancloud.cn/cb7ba1ac67490de8fd2eedb7fa01aee9_254x83.png) > ### 实例的` __proto__`,其实就是原型 > `console.log(xu.__proto__); ` ![](https://box.kancloud.cn/cb7ba1ac67490de8fd2eedb7fa01aee9_254x83.png) > ### 实例的原型的构造器,其实就是构造函数 `console.log(xu.__proto__.constructor); ` ![](https://box.kancloud.cn/b83b0453d387f6896c48afb4e5282e86_205x56.png) >构造函数Person === 实例的原型的构造器 `console.log(Person === xu.__proto__.constructor); // true ` > ### 在原型上定义一个方法 ``` Person.prototype.add = function(a, b) { console.log(a + b); } // xu.__proto__.reduce = function(a, b) xu.__proto__.constructor.prototype.reduce = function (a, b) { console.log(a - b); } xu.add(1, 2); xu.reduce(1, 2); ``` > ### __proto__和prototype `__proto__` 是实例具有的属性,指向原型 `prototype` 是构造函数具有的属性,可以直接通过`构造函数.prototype.函数名 = function(){}` 在原型上添加方法 > ### 获取某个原型, Object.getPrototypeOf(obj) ```js console.log(Object.getPrototypeOf(xu)); ``` ![](https://box.kancloud.cn/912583503e756f5bc7892cc8d7728549_299x84.png) > ### 原型链 1. 什么是原型链 读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。这个过程就叫原型链 2. 原型链的特点: - 如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overiding)。 - 一级级向上在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。 - constructor属性是原型对象上的一个属性,可以被所有实例对象所共享。要注意的是,prototype是构造函数的属性,而constructor则是构造函数的prototype属性所指向的那个对象,也就是原型对象的属性。由于constructor属性是一种原型对象和构造函数的关系,所以在修改原型对象的时候,一定要注意constructor的指向问题。 - instanceof运算符返回一个布尔值,用于判断对象是否为某个构造函数的实例。 3. 判断对象的固有属性 ``` Obj.hasOwnProperty('add') ```