1

在 Javascript 中有几种创建类的方法。但是我对这两种方式有一些疑问:

function MyClass(){

    this.myFun = function(){
        // do stuff
    }
}

var MyClass = {

    myFun: function(){
        // do stuff  
    }
}

唯一的区别是我不能使用new运算符的第二种方式?所以 Json 表示法允许我创建一个静态类或单例类,对吧?

4

3 回答 3

3

您显示的代码不会创建classes。javascript的概念class是未知的,它使用原型继承。现在至于你的代码。第一段代码代表一个构造函数。从中,您可以使用关键字派生实例- 具有共享属性的 javascript 对象new

function MyConstructor(name){
  this.name = name || 'no name yet';
  this.myFun = function(){
     alert(this.name);
  }
}
var instanceA = new MyConstructor('Webman')
   ,instanceB = new MyConstructor;
instanceA.myFun(); //=> 'Webman'
instanceB.myFun(); //=> 'no name yet'

第二段代码创建了一个 javascript 对象。它使用对象文字表示法。

var mySingleObject = {
    myFun: function(){
        alert('I am single');
    }
};
mySingleObject.myFun(); //=> 'I am single'

Mozilla 开发者网络有一个不错的页面,其中有更详细的解释。

使用对象字面量创建对象,一切都是公开的。使用构造函数,可以有私有变量,使用 javascripts闭包机制:

function MyConstructor(name){
   var namestring = 'the name property of this instance is: '+ 
                     (name || 'not set'); 
   this.myFun = function(){
     alert(namestring);
   }
 }
于 2012-08-18T08:53:43.060 回答
3

一些小的修正。在 JS 中,这些只是类模拟——该语言缺乏实际类的形式化概念。而且您的 JSON 表示法实际上是一个 JS 对象 - 这将是您当前拥有的无效 JSON。

您不必使用对象来模拟单例模式。您可以使用如下构造函数执行此操作:

function Animal() {
    if (Animal.instance) return Animal.instance;
    Animal.instance = this;
    /* constructor code here */
}
var animal_a = new Animal(); //constructor runs
var animal_b = new Animal(); //singleton instance returns
console.log(animal_a === animal_b); //true

此外,对于您的第一种方法,请注意最好将可重用、可继承的代码放在原型上,而不是为每个实例单独声明。这更快,也更明智 - 原型就是这样做的地方。

function Animal() {}
Animal.prototype.method = function() {}

这也避免了区分自己的和继承的属性的问题,在您的代码中,由于您在每个实例上分别声明方法,因此无法做到这一点。

[编辑- 回应 OP 关于私人成员的问题]

私有成员被实现为局部变量/函数,这意味着它们在当前闭包之外是不可访问的。

function Animal() {
    var private_var = 'foo';
    function private_method = function() { alert('bar'); };
}

公共方法可能(如果您选择)能够获取或设置它们 - 但为了它们自己可以访问这些私有成员,它们必须在构造函数内部声明,而不是在构造函数外部单独声明。

function Animal() {
    var private_var = 'foo';
    function private_method = function() { alert('bar'); };
    if (!Animal.prototype.public_method)
        Animal.prototype.public_method = function() {
            alert(private_var);
        };
}
var dog = new Animal();
dog.public_method(); //'foo'
于 2012-08-18T08:24:48.453 回答
1

javascript中没有类,javascript是一种原型语言。
没有比观看更快的方法来解释这一点了:Crockford on JavaScript - Chapter 2: And Then There Was JavaScript由 json 之父提供了一个简单的正确解释(以及其他内容)。

祝你好运!!

于 2012-08-18T08:23:01.653 回答