学习了JavaScript,觉得有必要对函数对象的prototype属性和普通对象的_proto_属性着重理解一下。
首先,万物皆对象。而对象又可分为函数对象和普通对象,当我们去用New Function()的时候,创建的就是函数对象。除开这种情况其他的都是普通对象,就如以下例子:
首先,万物皆对象。而对象又可分为函数对象和普通对象,当我们去用New Function()的时候,创建的就是函数对象。除开这种情况其他的都是普通对象,就如以下例子:
// 以下的三种情况创建的都是函数对象
var f1=function(){};
var function f2(){};
var f3=new Function('a','b');
// 以下的三种情况创建的都是普通对象
var o1={};
var o2=new f3();
var o3=new Object();
其中f1,f2归根结底还是用New Founction去创建的,所以是函数对象。
对于函数对象才有prototype属性,这个属性就是原型对象,这个原型对象其实就是一个普通对象(Function.prototyp除外),它没有prototype属性
从以上第二行代码可以看出,f1.prototype就是f1的一个实例对象 。就是在创建f1的时候,创建了他的一个实例对象并赋值给他的prototype属性,如下:
那么,这个属性有什么作用呢?继承作用,相当于将函数对象的公有属性放在prototype中,那么函数对象的实例会共享这些属性。
再说说_proto_属性,这个属性指向的是创建这个对象的函数对象的prototype属性,一层一层的对象继承就是以prototype为实体_proto_为连接纽带实现的。把这个有_proto_串起来的直到Object.prototype._proto_为null的链叫做原型链。
总结
1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成真正是靠_proto_而非prototype
对于函数对象才有prototype属性,这个属性就是原型对象,这个原型对象其实就是一个普通对象(Function.prototyp除外),它没有prototype属性
function f1(){};
console.log(f1.prototype) //f1{}
console.log(typeof f1.prototype) //Object
var te=new Function();
Function.prototype=te;
var function f1(name){
this.name;
}
f1.prototype.getName=function(){
return this.name;
}
var hty=new f1('hutianyi');
hty.getName();//hutianyi
总结
1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成真正是靠_proto_而非prototype