原型及原型链

很多初学者在自学前端一些原型、原型链和原型链的查找搞不清楚,很容易学蒙圈,分享一些在爱前端学习时总结的知识希望可以帮到你们

每一个函数天生就有原型(prototype)。

当函数被new调用的时候,产生的实例的__proto__都指向此构造函数的prototype对象。

function Fun () {

}

var f = new Fun();

console.log(f.__proto__ === Fun.prototype);//true

每一个函数天生都有prototype属性,它指向一个原型对象,这个属性对函数自己没有任何的用途。它唯一的用途给函数创建出来的实例用的。构造函数的prototype的指向个它new出来的__proto__属性的指向一样。

每一个对象在用点语法访问自己的属性和方法的时候,当遇见自己身上没有的属性或方法的时候,都会沿着原型链去查找。若果原型链上有这个查找的属性或方法,此时对象也可以打点调用个这个方法。如同自己的方法一样。

function People (name,age,sex) {

this.name = name;

this.age = age;

this.sex =sex;

}

People.prototype.sayHello = function(){

alert("你好,我是"+this.name+",我是一个可爱的小"+this.sex+"孩儿,我今年"+this.age+"岁了!")

};

var xiaoming = new People("小明",12,"男");

var xiaohong = new People("小红",12,"女");

console.log(xiaoming);

console.log(xiaohong);

xiaoming.sayHello();

xiaohong.sayHello();

console.log(xiaoming.sayHello === xiaohong.sayHello); //true

xiaoming和xiaohong的sayHello 的方法放在了构造函数的原型上了。

当xiaoming和xiaohong打点调用sayHello 的方法的时候,先看自己有没有,自己没有,就去People.prototype身上查找。

若果People.prototype身上没有sayHello 的方法,它会沿着People.prototype.prototype去查找,一直查找到object.prototype上为止,若都没有,那次方法或属性不能用。

我们称People.prototype是People构造函数的“原型”,People.prototype是xiaoming和xiaohong的“原型对象”。

__proto__这个功能将我们的函数能实现复用了,因为JS程序设计的时候,所有的对象都有原型链查找功能。

原型及原型链_第1张图片

3.2 、Object.prototype 是所有的对象原型链的终点

任何的对象都有原型对象(__proto__)

在JS中,对象是对象,函数是对象,数组也是对象,正则表达式也是对象,所有的引用类型值都是对象。在JS中都是对象,他们都有__proto__属性。

Object它是JS程序语言中内置的一个构造函数,“所有的真正对象”可以认为是Object new出来的。

var obj = new Object();

obj.name = "小红";

obj.age = 12;

console.log(obj);

console.log(Object.prototype === obj.__proto__);

原型及原型链_第2张图片

所有的真正对象不是函数、不是数组、不是正则;

真正对象而是以{}这样字面量形式定义的对象和所有的原型对象可以看做是Object new出来的。

var obj1 = {

}

console.log(Object.prototype === obj1.__proto__);

function People () {

}

var xiaoming = new People();

console.log(People.prototype.__proto__ === Object.prototype);

原型及原型链_第3张图片

Object.prototype 是唯一没有__proto__的对象。而其它的所有的对象、函数、数组、正则表达式都有__proto__。

先分享这么多了,以后会不定期的分享,如果你也是自学,可以加一些技术群一起探讨交流,也可以加我在的爱前端技术分享交流群哦。

你可能感兴趣的:(原型及原型链)