如何“正确”在JavaScript中创建自定义对象?

485

我想知道创建一个拥有属性和方法的JavaScript对象的最佳方式是什么。

我看过一些例子,其中的人使用了 var self = this,然后在所有函数中使用 self. 确保作用域始终正确。

接着,我又看到有人使用 .prototype 添加属性,而其他人则在代码中直接添加属性。

能否给我一个适当的JavaScript对象示例,其中包含一些属性和方法?


15
没有一种“最好”的方式。 - Kenan Banks
“self”不是保留字吗?如果不是,它应该是;因为“self”是一个预定义变量,指向当前窗口。“self === window”。 - Shaz
2
@Shaz:它并不比浏览器对象模型中的其他 window 属性如 documentframes 更具保留意义;你肯定可以将其作为变量名重新使用该标识符。尽管如此,从风格上讲,我更喜欢使用 var that= this 以避免任何可能的混淆。尽管 window.self 最终是毫无意义的,所以很少有理由去碰它。 - bobince
7
当JS代码被压缩时,将this赋值给一个本地变量(例如self)可以减小文件大小。 - Patrick Fisher
Classjs新链接:https://github.com/divio/classjs - Nikola
15个回答

1

我想提醒大家,我们可以使用标题字符串来声明一个对象。
对于每种类型的调用方式不同。请参见以下内容:

var test = {

  useTitle : "Here we use 'a Title' to declare an Object",
  'useString': "Here we use 'a String' to declare an Object",
  
  onTitle : function() {
    return this.useTitle;
  },
  
  onString : function(type) {
    return this[type];
  }
  
}

console.log(test.onTitle());
console.log(test.onString('useString'));


0
除了2009年的被接受答案之外,如果你可以针对现代浏览器,可以使用Object.defineProperty

Object.defineProperty()方法直接在对象上定义一个新属性或修改对象上的现有属性,并返回该对象。 来源:Mozilla

var Foo = (function () {
    function Foo() {
        this._bar = false;
    }
    Object.defineProperty(Foo.prototype, "bar", {
        get: function () {
            return this._bar;
        },
        set: function (theBar) {
            this._bar = theBar;
        },
        enumerable: true,
        configurable: true
    });
    Foo.prototype.toTest = function () {
        alert("my value is " + this.bar);
    };
    return Foo;
}());

// test instance
var test = new Foo();
test.bar = true;
test.toTest();

要查看桌面和移动设备的兼容性列表,请参见Mozilla浏览器兼容性列表。是的,IE9+也支持它,以及Safari移动版。


0
var Person = function (lastname, age, job){
this.name = name;
this.age = age;
this.job = job;
this.changeName = function(name){
this.lastname = name;
}
}
var myWorker = new Person('Adeola', 23, 'Web Developer');
myWorker.changeName('Timmy');

console.log("New Worker" + myWorker.lastname);

4
那句话已经有很多详细的回答了,这句话加入了什么内容? - blm
我喜欢这个答案,因为它简洁明了地展示了实现的三个部分:1)定义对象,2)实例化对象的实例,3)使用实例 - 一目了然,而不是需要解析所有冗长的答案(当然,这些答案都非常好,并提供了人们想要的所有相关细节)- 这里有一个简单的总结。 - G-Man

0

你也可以尝试这个

    function Person(obj) {
    'use strict';
    if (typeof obj === "undefined") {
        this.name = "Bob";
        this.age = 32;
        this.company = "Facebook";
    } else {
        this.name = obj.name;
        this.age = obj.age;
        this.company = obj.company;
    }

}

Person.prototype.print = function () {
    'use strict';
    console.log("Name: " + this.name + " Age : " + this.age + " Company : " + this.company);
};

var p1 = new Person({name: "Alex", age: 23, company: "Google"});
p1.print();

-1
基本上,JS 中没有类的概念,因此我们使用函数作为类构造器,与现有的设计模式相关。
//Constructor Pattern
function Person(name, age, job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.doSomething = function(){
    alert('I am Happy');
}
}

到目前为止,JS不知道你想创建一个对象,所以这里就出现了新的关键字。
var person1 = new Person('Arv', 30, 'Software');
person1.name //Arv

参考资料:Web开发专业JavaScript - Nik Z


适当给出理由的反对会更有建设性,也会提供改进的机会。 - Airwind711
在JS中确实有class的概念,就像你在标题中使用function关键字所提到的那样。它不是一种设计模式,而是语言的一个有意的特性。我没有在这个问题上给你投反对票,但看起来有人因为回答过于简洁和几乎与问题无关而投了反对票。希望这个反馈能够帮到你。 - Cody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接