2010-10-26 108 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(但被 一些实现支持)。