我是javascript的新手。据我所知,有5种方法可以制作一个对象(我猜是一个结构)。我想知道最好的方法是什么。感谢。
var makeOption = function(name, dataType){
var option = {
name: name,
dataType: dataType
};
return option;
};
var makeOption2 = function(name, dataType){
this.name = name;
this.dataType = dataType;
};
function makeOption3(name, dataType){
this.name = name;
this.dataType = dataType;
};
var makeOption4 = function makeOption4Name(name, dataType){
this.name = name;
this.dataType = dataType;
};
var v1A = makeOption("hannah", "int");
var v1B = new makeOption("hannah", "int");
//var v2A = makeOption2("hannah", "int"); <- undefined.
var v2B = new makeOption2("hannah", "int");
// var v3A = makeOption3("hannah", "int"); <- undefined.
var v3B = new makeOption3("hannah", "int");
// var v4A = makeOption4("hannah" ,"int"); <- undefined.
var v4B = new makeOption4("hannah" ,"int");
这是firebug DOM选项卡中显示的内容:
答案 0 :(得分:4)
我会选择#3。
答案 1 :(得分:2)
从John John Resig的帖子中得到关于javascript“Class”instatiation的内容,他指出......
// Very fast
function User(){}
User.prototype = { /* Lots of properties ... */ };
// Very slow
function User(){
return { /* Lots of properties */ };
}
这就是我们所说的他发布了这段代码......
// makeClass - By John Resig (MIT Licensed)
function makeClass(){
return function(args){
if ( this instanceof arguments.callee ) {
if ( typeof this.init == "function" )
this.init.apply( this, args.callee ? args : arguments );
} else
return new arguments.callee( arguments );
};
}
然后使用它,利用原型链的速度..
var User = makeClass();
User.prototype.init = function(first, last){
this.name = first + " " + last;
};
var user = User("John", "Resig");
user.name
// => "John Resig"
这也考虑了new
的使用,它允许使用关键字,但不需要它。
<强> Link to Original Post 强>
答案 2 :(得分:2)
从设计的角度来看,第一个是优选的 - 基于您的名字。
makeOption
表示它会创建并重新调整对象。
所有其他解决方案实际上并不返回对象并需要“新”调用。当用作纯数据结构时,它们可能具有相似/相同的技术结果,但只有第一个用作“对象制造者”,顾名思义。
如果您想使用#2/3(#4没有意义 - 为什么要将该功能克隆两次),那么您需要将其命名为其他内容 - optionPrototype
可能是。
答案 3 :(得分:2)
我个人使用makeoption3我已经尝试了所有这些并发现如果你正在编写多个对象,makeoption3是最干净和最简单的。此外,它的代码少于保持文件大小的其他代码。
function makeOption3(name, dataType){
this.name = name;
this.dataType = dataType;
};
答案 4 :(得分:2)
如果您不需要继承功能,请使用#1(因为您基本上只是使用它来构建和返回对象文字)。否则我会选择#3,因为它允许原型方法,也是一个命名函数而不是匿名函数。
答案 5 :(得分:2)
关于JavaScript最佳实践的书籍全部内容都是针对这一主题撰写的。那就是说:如果你不关心继承并且不打算用方法创建大量的对象副本, ie ,你只是创建一个“struct”,然后是对象文字表示法,你的第一个例子,是要走的路。在该方法中,您使用的是对象文字符号,它是轻量级且快速的。它不会弄乱对象原型或需要使用new
运算符。
然后,开始向对象添加方法,答案将更改为“它取决于”。
顺便说一句,你遗漏了几种创建对象的方法:
var o = {};
o.name = "hannah";
o.dataType = "int";
并且,不推荐:
var o = new Object();
o.name = "hannah";
o.dataType = "int";
答案 6 :(得分:0)
为什么不想使用对象文字?看起来你真的在问对象和继承..?