每天努力一点
在JavaScript中,函数本身也是一个包含了属性和方法的对象,每个函数都有prototype属性,而该属性所储存的就是原型对象,我们需要明白的是当一个函数被创建时,属性中就包含了prototype属性,它的初始值是一个“空”对象。
function foo(a,b){
return a*b;
}
console.log(typeof foo.prototype) //object
我们可以为这个空对象赋予一些属性和方法,这并不会对foo函数本身造成什么影响;因为只有当foo()作为构造器使用时,这些属性才会起作用。
isPrototypeOf()方法
每个对象都会有一个isPrototypeOf()方法,这个方法会告诉我们当前对象是否是另一个对象的原型。
var monkey = {
hair: true,
feeds: 'banans',
breathes: 'air'
}
function Human(name){
this.name = name;
}
Human.prototype = monkey;
var george = new Human('george');
console.log(monkey.isPrototypeOf(george)); // true
我们创建一个叫Human的构造函数,并将其原型属性设置为指向monkey,需要注意的是,我们在这里是预先知道monkey可能是george的原型;然后获得了一个布尔值的回应。那么是否能在不知道某个对象原型是什么情况下,获得对象的原型呢,ES5有一个Obeject.getPrototypeOf()方法。
Object.getPrototypeOf() 方法返回指定对象的原型
Object.getPrototypeOf(george) === monkey //true
hasOwnProperty()方法
用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法(不要忘了它是从Object继承来的)只在给定属性存在于对象实例中时,才会返回true。
function A(){
}
A.prototype.name = 'hello';
var b = new A();
b.age = 1;
console.log(b.hasOwnProperty("age")) // true
console.log(b.hasOwnProperty("name")) //false
GitHub:JavaScript-Demo