根据在创建对象的时候,创建出来的对象的__proto__指向创建这个对象的函数的prototype属性。
由于在调用对象的属性或者方法的时候会首先在对象的作用域中查找指定的属性或者方法,如果未找到则会去对象的原型链(即__proto__对象)上查找。所以可以在自定义函数的时候往函数的prototype属性对象上面添加自己的属性和方法(一般是添加方法),然后在用这个函数生成对象的时候则生成的对象就可以直接访问这些添加在函数的prototype上的属性和方法。
如JS内置的Date函数,在我们使用var date = new Date();后date对象中就由很多Date函数中预先在prototype上添加的方法可以使用。
在用函数创建实例对象的时候,一般不同的实例对象的属性是不一样的,而所拥有的方法一般是相同的。
比如一个Person的函数创建person实例,每一个创建出来的person都有自己不同的name和age,而一般他们都有相同的方法如walk(),eat()...
所有在为一个函数定义属性的时候一般通过构造函数中定义在对象自身上面,而方法则定义在函数的prototype上以便生成实例时继承到实例对象。
function Person(name,age){
this.name =name;//注意这里面的代码是在创建实例的时候才执行,所以name和age只有在实例上面才会存在,在Person函数对象上不会有这两个属性
this.age=age;
}
Person.prototype.walk=function(){};
Person.prototype.eat=function(){};
var p1 = new Person('Tom',11);
var p2 = new Person('Jack',12);