每天努力一點
在JavaScript中,函數(shù)本身也是一個包含了屬性和方法的對象,每個函數(shù)都有prototype屬性,而該屬性所儲存的就是原型對象,我們需要明白的是當一個函數(shù)被創(chuàng)建時,屬性中就包含了prototype屬性,它的初始值是一個“空”對象。
function foo(a,b){
return a*b;
}
console.log(typeof foo.prototype) //object
我們可以為這個空對象賦予一些屬性和方法,這并不會對foo函數(shù)本身造成什么影響;因為只有當foo()作為構(gòu)造器使用時,這些屬性才會起作用。
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
我們創(chuàng)建一個叫Human的構(gòu)造函數(shù),并將其原型屬性設(shè)置為指向monkey,需要注意的是,我們在這里是預(yù)先知道m(xù)onkey可能是george的原型;然后獲得了一個布爾值的回應(yīng)。那么是否能在不知道某個對象原型是什么情況下,獲得對象的原型呢,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