对于原型,有一篇很好的文章:(https://blog.csdn.net/weixin_38654336/article/details/83050165) https://blog.csdn.net/u012468376/article/details/53121081
原型是js中继承的基础,这里有几个要知道的。 1.每个对象都有一个constructor属性指向它的构造函数。 2.每个对象都有一个__proto__ 属性指向它的原型。 3.实例对象中的prototype属性不可直接访问。
好了,开始: 我们每声明一个构造函数
function Person(){
this.age=20;
this.name="张三";
}
浏览器就会创建一个对象,这就是原型对象,原型对象存储在内存中了。这个原型对象就是以后实例对象的基类。
var person1=new Person();
console.log(person1.age);
这里new了一个对象,对于查找person1的属性,如果有它自己的属性就会先用它自己的属性,如果没有找到,就会到他的原型对象中找,这里的age就在原型对象中找到。
下面说说几个点,原型的全面了解建议看上面的连接 1.(上面文章的原话) 我们根据需要,可以Person.prototype 属性指定新的对象,来作为Person的原型对象。
但是这个时候有个问题,新的对象的constructor属性则不再指向Person构造函数了。
<script type="text/javascript">
function Person () {
}
Person.prototype = {
name:"志玲",
age:20
};
var p1 = new Person();
alert(p1.name);
alert(p1 instanceof Person);
alert(Person.prototype.constructor === Person);
</script>
在构造中的方法,实例的对象都是各自独占一份的。
function Person(){
this.age=20;
this.name="张三";
this.eat=function(){
console.log("吃东西");
}
}
var person1=new Person();
var person2=new Person();
console.log(person1.eat===person2.eat)
但是可以在原型对象中实现函数的共享
function Person(){
this.age=20;
this.name="张三";
}
Person.prototype.eat = function () {
alert("吃");
}
var person1=new Person();
var person2=new Person();
console.log(person1.eat===person2.eat)
顺便提一下,在js中,即使两个对象的属性和函数都相等,js也不会判断他们两个相等
3.对于 person1.__proto__是 Person.prototype Person.__proto__是Function.prototype 的解释 1、首选__proto__是浏览器厂商实现的,W3C规范中并没有这个东西。 2、它的作用就是访问对象的原型。 3、对于js来说,一切皆对象,尤其是引用类型,更是如此。 4、所有的对象都有一个原型(null除外),函数是对象,那么函数也不例外。所以Person.__proto__就是访问这个构造函数的原型。 5、每一个函数都有一个prototype属性,属性的值也是一个对象,称为原型对象。所以Person.prototype访问的就是这个Person类的原型对象。 6、抛开__proto__来说,通过属性访问Person的原型可以这样写:Person.constructor.prototype。也就是说 Person.contractor.prototype === Person.proto //true; 7、假如实例化Person,var p = new Person();综上所述, p.constructor === Person // true; p.constructor.prototype === Person.prototype // true; 不知道这样解释能理解嘛。(大佬的原话…)
|