什么是prototype属性?
来举个例子吧,我们先创建一个对象。
<script>
function Person(name,age){
this.name=name;
this.age=age;
}
var xiaoming=new Person("xiaoming",45)
Person.prototype.sallary=null;
xiaoming.salary=4000;
alert(xiaoming.salary)//4000
</script>
接着控制台。我们可以查一下这个构造函数的prototype属性。
再看看这个
最后对比
可以看到构造函数的prototype和实例对象的_proto对象是一样的。
prototype和_proto什么关系?
P.prototype=p.__proto_
在JavaScript中,每个函数都有一个prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的proto属性),也就是说,所有实例的原型引用的是函数的prototype属性
就这么简单~
为什么要有prototype属性?
那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。
这篇文章说的很清楚,可以参考
Javascript 面向对象编程(一) 封装js面向对象脚本之家
prototype是对象还是属性?
是属性也是对象!amazing。但是看例子吧
比如有constructor属性
prototype对象和构造函数对象有何关系?
为了表述简单,我把构造函数对象叫做类。要不然读着读着自己都乱了。
类才有prototype属性(对象)
所有的对象都有"proto"属性,该属性对应该对象的类的prototype属性(对象)
所有类都有"prototype"属性,该属性的值会被赋值给该函数创建的实例对象的"proto"属性
所有的prototype都有"constructor"属性,该属性对应创建所有指向该原型的实例的构造函数
类和原型对象通过"prototype"和"constructor"属性进行相互关联
什么是原型链?
如图,追到最后就是null了
总结
这里的内容说起来太拗口了。算了,知道这一个就够了
P.prototype=p.__proto_
其实很简单,只是js设计的绕弯了罢了,或者说函数式编程本身就是不太好理解的?