一、函数对象和普通对象
javascript中,一切皆是对象,分为函数对象和普通对象。下面举一个简单的例子。
function f(){
console.log("我是函数")
};
var o={data:"我是普通对象"};//普通对象
var f1= new f();//函数对象
var f2=new function(){};//函数对象
其中,o是普通对象,f1是函数对象,即我们通常所说本身等于对象或者调用函数的值为函数对象,本身等于对象的为普通对象。
二、原形对象
下面我们把目光聚焦刀函数对象,所有函数对象在创建时都会有很多默认属性,其中有一个prototype属性,这就是我们所说的原形对象。注意:普通对象没有原形对象,但是有____proto__ __属性。函数对象也有____proto__ __属性。
所有东西存在都是有着自己本身的意义,prototype存在的意义就是用于继承,举个例子。
function f(){
console.log("我是函数")
};
f.prototype.common="共有属性";
var f1= new f();
var f2= new f();
console.log(f1.common);//"共有属性"
console.log(f2.common);//"共有属性"
函数f的共有属性是 common:"共有属性",所以它所有的"孩子"全部拥有这个属性。
思考:
function f(){
console.log("我是函数")
};
f.prototype.common=100;
var f1= new f();
var f2= new f();
f2.common-=20;
console.log(f1.common);//?
console.log(f2.common);//?
f.prototype.common-=30;
console.log(f1.common);//?
console.log(f2.common);//?
f2.common-=20;
console.log(f1.common);//100
console.log(f2.common);//80
f.prototype.common-=30;
console.log(f1.common);//70
console.log(f2.common);//80
你答对了吗?
三、原形链
所有对象的____proto__ __属性都指向它父亲的prototype属性。
function f(){
console.log("我是函数")
};
f.prototype.common="共有属性";
var f1= new f();
console.log(f1.__proto__);//f.prototype(object{common:"共有属性",等一项})
console.log(f1.__proto__===f.prototype);//true;
这就是为什么自己能用父亲的属性,因为自己有一个____proto__ __属性,自己的属性自己当然能用。
玩一个有意思的找爸爸的游戏
function f(){
console.log("我是函数")
};
var f1= new f();
console.log(f.__proto__);//function()--所有函数名的爸爸都是function;
console.log(f1.__proto__);//f1.prototype;
console.log(f1.__proto__.__proto__===f.__proto__.__proto__);//true
console.log(f1.__proto__.__proto__);//object
console.log(f1.__proto__.__proto__.__proto__);//null
四、总结
记得在网上看到一个大神的解释很有意思。
爸爸给哥哥买了很多玩具,这些玩具你也可以使用,之后你生了儿子,你给你儿子买了很多玩具,同时,你哥哥的玩具你也可以给你儿子玩。