我可能遗漏了一些关于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
答案 0 :(得分:2)
你的第一个例子是一个对象文字:
var person = {
name: "Bob",
//etc
};
你创建了一个名为person的对象,就是这样。创建新人员的概念毫无意义。
如果你想创建一些可以随意创建更多对象的东西,你可以使用一个函数,就像你的第二个例子一样。
请注意,用作构造函数的函数按惯例以大写字母开头。另请注意,使用
在构造函数内部设置函数时this.functionName = function() .....
这会创建一个特权函数,因为它可以访问公共成员和私有成员。如果此set函数只需要访问公共属性,则通常会将其添加到函数的prototype
中。以下是整个事物看起来的样子
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;
};
答案 1 :(得分:1)
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;
}
};
只创建函数,当使用this
调用函数时,返回new
所有已分配的属性。
正如documentation of new
operator on Mozilla Developer Network所说:
new
运算符创建用户定义对象类型的实例或具有构造函数的内置对象类型之一。...
创建用户定义的对象需要两个步骤:
- 通过编写函数定义对象类型。
- 使用
new
创建对象的实例。
你基本上在第二种情况下做了两个步骤。
答案 2 :(得分:1)
你回答自己的问题。构造函数(new
旁边的东西)必须是JavaScript中的函数。
答案 3 :(得分:0)
第一个版本使用对象文字来创建分配给person
的单个对象实例。这不能像new
的构造函数一样用于从person
创建其他对象。
第二个版本使用一个函数,可以作为构造函数调用,以new person()
创建新对象。
这就是new
在JavaScript中的工作方式。基本上,如果您希望能够从模板创建多个实例(类似于其他语言中的类的工作方式),那么请使用new FunctionName()
语法。如果您只需要创建特定对象的单个实例,则可以使用第一种语法。
请注意,在第一个版本中,您可以说:
person.set('Victor',12);
alert(person.name); // 'Victor'
另请注意,如果要创建一个用作构造函数的函数,则约定是使用大写字母表示其名称的第一个字母(或名称中每个单词的第一个字母)。