javascript如何创建对象?

时间:2010-10-26 09:43:11

标签: javascript prototype

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

有人告诉我上述代码等于:

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 个答案:

答案 0 :(得分:2)

代码:

var p=new Person('stackoverflow');

创建Person类的新实例。你必须记住javascript中的类是函数,所以当你调用时:

Person.call(p,'stackoverflow');

您只是调用Person函数并将其绑定到p对象(这意味着在函数上下文中this将引用p对象)。这些代码片段做同样的事情,除了第一个是类的实例的事实,所以如果你更新person的原型对象,它的属性将被更新。

无论如何,填充Person函数的原型对象时情况会有所不同:

Person.prototype={test:"test"}

如果在Person函数声明之后添加它,您将看到这些代码片段具有不同的行为。用“new”初始化的对象将包含test属性,但另一个没有它。发生这种情况是因为原型对象在使用“new”时仅应用于类的实例。

答案 1 :(得分:0)

嗯,实际上

var p=new Person('stackoverflow');

相当于:

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

除了__proto__不是标准JavaScript(但受到支持) 一些实现)。