在javascript中实例化新对象

在javascript中实例化新对象,javascript,object,instance,literals,javascript-objects,Javascript,Object,Instance,Literals,Javascript Objects,我可能缺少一些真正的javascript基础知识,但为什么这不起作用呢 var person = { name:"", age:0, set : function(name,age){ this.name = name; this.age = age; } } var me = new person; // ERROR: Object doesn't support this action! me.set('Victor',1

我可能缺少一些真正的javascript基础知识,但为什么这不起作用呢

var person = {

    name:"",
    age:0,

    set : function(name,age){
        this.name = name;
        this.age = age;
    }
}

var me = new person; // ERROR: Object doesn't support this action!
me.set('Victor',12);
me.name //Victor

但这确实:

var person = function(){

    this.name="";
    this.age=0;

    this.set = function(name,age){
        this.name=name;
        this.age=age;
    }
}

var me = new person(); //WORKS!
me.set('Victor',12);
me.name; //Victor
JavaScript没有类(尽管您可以模拟它们),这就是原因。而
new
仅对函数有效(在本例中,它在函数内部创建特殊变量
this
,该变量在函数调用后隐式返回)

因此,在使用时:

var person = {
    name:"",
    age:0,
    set : function(name,age){
        this.name = name;
        this.age = age;
    }
};
您已经创建了一个对象(其属性之一是函数)

但是当你使用这个:

var person = function(){
    this.name="";
    this.age=0;
    this.set = function(name,age){
        this.name=name;
        this.age=age;
    }
};
仅创建函数,当使用
new
调用该函数时,该函数返回
this
以及所有指定的属性

文件怎么说 正如上面所说:

new
运算符创建用户定义的对象类型或具有构造函数的内置对象类型之一的实例

创建用户定义的对象需要两个步骤:

  • 通过编写函数定义对象类型
  • 使用
    new
    创建对象的实例
在第二种情况下,您基本上完成了这两个步骤。

JavaScript没有类(尽管您可以模拟它们),这就是原因。而
new
仅对函数有效(在本例中,它在函数内部创建特殊变量
this
,该变量在函数调用后隐式返回)

因此,在使用时:

var person = {
    name:"",
    age:0,
    set : function(name,age){
        this.name = name;
        this.age = age;
    }
};
您已经创建了一个对象(其属性之一是函数)

但是当你使用这个:

var person = function(){
    this.name="";
    this.age=0;
    this.set = function(name,age){
        this.name=name;
        this.age=age;
    }
};
仅创建函数,当使用
new
调用该函数时,该函数返回
this
以及所有指定的属性

文件怎么说 正如上面所说:

new
运算符创建用户定义的对象类型或具有构造函数的内置对象类型之一的实例

创建用户定义的对象需要两个步骤:

  • 通过编写函数定义对象类型
  • 使用
    new
    创建对象的实例

在第二种情况下,你基本上都做了这两个步骤。

你回答自己的问题。构造函数(new旁边的东西)必须是JavaScript中的函数。

您可以回答自己的问题。构造函数(紧挨着
new
的东西)必须是JavaScript中的函数。

第一个版本使用对象文本创建一个分配给
person
的单个对象实例。这不能像使用
new
的构造函数一样用于从
person
创建其他对象

第二个版本使用一个函数,该函数可以作为构造函数调用,以使用
newperson()
创建新对象

这就是
new
在JavaScript中的工作方式。基本上,如果您希望能够从一个模板创建多个实例(类似于其他语言中的类的工作方式),请使用
newfunctionname()
语法。如果只需要创建特定对象的单个实例,则可以使用第一种语法

请注意,在第一个版本中,您可以说:

person.set('Victor',12);
alert(person.name); // 'Victor'

还请注意,如果您要创建一个用作构造函数的函数,则约定为其名称的第一个字母(或名称中每个单词的第一个字母)使用大写。

第一个版本使用对象文字创建一个指定给
person
的单个对象实例。这不能像使用
new
的构造函数一样用于从
person
创建其他对象

第二个版本使用一个函数,该函数可以作为构造函数调用,以使用
newperson()
创建新对象

这就是
new
在JavaScript中的工作方式。基本上,如果您希望能够从一个模板创建多个实例(类似于其他语言中的类的工作方式),请使用
newfunctionname()
语法。如果只需要创建特定对象的单个实例,则可以使用第一种语法

请注意,在第一个版本中,您可以说:

person.set('Victor',12);
alert(person.name); // 'Victor'

另外请注意,如果您正在创建一个用作构造函数的函数,则约定将其名称的第一个字母(或名称中每个单词的第一个字母)使用大写。

您的第一个示例是对象文字:

var person = {
    name: "Bob",
    //etc
};
您已经创建了一个名为person的对象,就是这样。创造新的人的概念毫无意义

如果你想创建一些可以用来随意创建更多对象的东西,你可以使用一个函数,比如你的第二个例子

但请注意,按照惯例,打算用作构造函数的函数以大写字母开头。还请注意,当您使用

this.functionName = function() .....
这将创建一个特权函数,因为它可以访问公共和私有成员。如果此set函数只需要访问公共属性,则通常会将其添加到函数的
原型中。下面是整个事情的样子

function Person() {
    this.name = "";
    this.age = 0;
};

Person.prototype.set = function(name,age) {
    this.name = name;
    this.age = age;
}
下面是特权方法的外观

function Person() {
    var localData = "Hello";

    this.showPrivateData = function() {
        alert(localData);
    };

    this.name="";
    this.age=0;
};
localData
Person
函数的本地数据,不能作为Person实例的属性访问;但是,
showPrivateData
函数以及您可能添加的任何其他特权函数将在其上形成一个闭包,并且可以访问它

最后,请注意,构造函数可以采用以下参数:

function Person(name, age) {
    this.name= name;
    this.age= age;
};

您的第一个示例是对象文字:

var person = {
    name: "Bob",
    //etc
};
您已经创建了一个名为person的对象,就是这样。创造新的人的概念毫无意义

如果你想创建一些可以用来随意创建更多对象的东西,你可以使用f