2010-10-26 158 views
3
function Person(name) { 
    this.name = name; 
    this.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 
var p=new Person('stackoverflow'); 

有人告訴我,上面的代碼等同於:javascript如何創建一個對象?

function Person(name) { 
    this.name = name; 
    this.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 

var p={}; 
Person.call(p,'stackoverflow'); 

這是真的嗎?

如果是這樣,原型如何?

javascripte中的每個對象都擁有一個原型,原型鏈持有對象的變體,我不知道這個原型是否做了某件事。

在這個例子中,當'p'的對象被創建時,它是否調用Person的超類的一些內置方法?

順便說一句,我想知道的是語法var p=new Person('stackoverflow');做什麼?


-----------------更新------------------

function Person(name) { 
    this.name = name; 
} 
Person.prototype.say = function() { 
    console.info('I am ' + this.name); 
} 

怎麼樣,如果我把說的認定中的人函數內部:

function Person(name) { 
    this.name = name; 
    Person.prototype.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 

回答

2

代碼:

var p=new Person('stackoverflow'); 

創建一個新的實例Person類。你必須記住,類在JavaScript中的功能,所以當你撥打:

Person.call(p,'stackoverflow'); 

你只是呼叫的人的功能,並將其綁定到p對象(這意味着在功能方面的this將參考p對象)。這些代碼段做同樣的事情,除了第一個是類的實例,所以如果你更新人的原型對象,它的屬性將被更新。

Person.prototype={test:"test"} 

如果你的人函數聲明之後添加此你會看到這些代碼段有不同的行爲:

無論如何,當你填人函數的原型對象的情況是不同的。用「new」初始化的對象將包含測試屬性,但另一個沒有它。發生這種情況是因爲在使用「新」時原型對象僅應用於類的實例。

+0

也就是說,第一個擁有Person的原型? – hguser 2010-10-26 10:50:29

+0

是的,因爲它是Person的一個實例,Person的原型的每個屬性都應用於該對象。在這兩種情況下添加'Person.prototype = {test:「test」};'並用console.dir(p)與firbug進行測試,您將看到不同之處。 – mck89 2010-10-26 10:58:30

+0

謝謝,我測試了一下,現在我知道了:)順便說一下,Eclipse中是否有插件可以直接運行javascript並單獨運行? – hguser 2010-10-26 11:37:00

0

嗯,其實

var p=new Person('stackoverflow'); 

等同於:

var p={}; 
p.__proto__ = Person.prototype; 
Person.call(p,'stackoverflow'); 

除了__proto__不是標準的JavaScript(但被 一些實現支持)。

相關問題