很多初学者在自学前端一些原型、原型链和原型链的查找搞不清楚,很容易学蒙圈,分享一些在爱前端学习时总结的知识希望可以帮到你们
每一个函数天生就有原型(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程序设计的时候,所有的对象都有原型链查找功能。
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__);
所有的真正对象不是函数、不是数组、不是正则;
真正对象而是以{}这样字面量形式定义的对象和所有的原型对象可以看做是Object new出来的。
var obj1 = {
}
console.log(Object.prototype === obj1.__proto__);
function People () {
}
var xiaoming = new People();
console.log(People.prototype.__proto__ === Object.prototype);
Object.prototype 是唯一没有__proto__的对象。而其它的所有的对象、函数、数组、正则表达式都有__proto__。
先分享这么多了,以后会不定期的分享,如果你也是自学,可以加一些技术群一起探讨交流,也可以加我在的爱前端技术分享交流群哦。
网友评论