2012-07-13 111 views
4

我发现在JavaScript中很难理解OOP。JavaScript OOP类和声明

通常我会希望创建一个类,然后从该类创建对象。

但是,根据一个教程,以下内容会产生一个对象。

var egg = {} 

难道我没有做过一个名为egg的对象,但实际上没有上课。

如果那是我会怎么做,从一个对象的多个对象的情况:S

而且根据不同的教程的对象是由像下面,这是完全的区别是什么,我上面说:S

var Block = function(){ 

} 

谁能帮我解开我的困惑:(

+0

[构造函数和对象之间的差异]可能的重复(http://stackoverflow.com/questions/4559207/difference-between-a-constructor-and-an-object) – qwertymk 2012-07-13 22:16:49

+0

但这样做不会毁掉整个点OOP? – 2012-07-13 22:17:33

+0

btw。你在'var Block = ...'语句中缺少一个新的东西 – 2012-07-13 22:23:22

回答

2

JavaScript是与迄今为止学到的不同的语言。你不能指望事情和你改变语言时一样。

快速偷看:在JavaScript中,您可以将一个函数分配给一个变量。我敢打赌,你已经使用其它语言,这是不可能的:

var myCounter = 1; 
var myFunction = function(x){ return x + 1; }; 

再回到你的问题:在javascript中有没有“真正的类”。只有对象。我知道这听起来可能听起来很混乱。

Javascript的对象模型被称为“原型继承”。它不同于“经典”(双关意图)的继承。而且它也是not very cleanly implemented。基本上,你从一个缩小的对象集合(数组,对象,而不是类)开始,然后使用这些对象来构建其他对象。他们之间的关系可以是“类和实例”,但他们不必这样做。他们也可以是其他种类的关系。

由于没有类,所以不能创建它们。但是你可以创建一个常规的对象,将它分配给变量Car,并且只是想“我要用这个对象来创建很多其他对象,而其他对象默认会有一些属性,比如方法和东西,让他们表现得像汽车一样“。语言允许你这样做。汽车将像其他语言中的类一样行事,它产生的对象将“像汽车的实例”一样。

但是,对于javascript来说,它们看起来像是一些对象,它们之间有一些关系。

从某种意义上说,原型继承是经典继承的“超集”。你可以做经典的继承,但也可以做其他事情。

2

有我不只是做一个指定的对象不蛋居然作出 类。

没错。所有你在做的是实例化基地Object对象 - 你还没有做任何事情,你可以使的实例。

在JavaScript中,没有形式化的类概念 - 仅仅通过实例化而不是调用函数来实现它们的模拟。

function Animal() { this.animal = true; } 
Animal.prototype.sayHi = function() { alert(this.name+' says hi!'); } 
function Dog(name) { this.name = name; } 
Dog.prototype = new Animal(); 
... 
var fido = new Dog('Fido'); 
fido.sayHi(); //"Fido says hi!"; 

注意第4行只是模拟继承的几种方法之一。

所以在JavaScript中,类和函数都只是函数。没有任何固有的东西可以防止用于实例化的函数在没有new运算符的情况下被调用,反之亦然。

在前一种情况下,常见的解决方法是检查构造是“类”(如果调用并没有实例化,构造函数会Object)和重新路由的必要:

function Dog(name) { 
    //if we weren't instantiated, the constructor will be Object, not Dog 
    if(this.constructor != Dog) return new Dog(name); 
    this.name = name; 
} 
var fido = Dog(); //bad - invocation should be instantiation 
+1

这是最简单的,尽管是一种天真的方式,它需要实例化基础对象才能设置原型链。足以回答这个问题。我写了一篇关于在JS中构成正确继承的文章。 http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html – 2012-07-13 22:31:17

+0

你说得很对,胡安 - 这绝对是实现继承的几种方法中最简单的方法(它们都不是完美,都有特色)。我将它包含在这里,以免混淆答案的主要观点。我会检查你的帖子。 – Utkanos 2012-07-13 22:38:42

+0

我其实也写了关于缓解调用构造函数时没有新运算符的问题:) http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html似乎是什么你在做这个测试。构造函数' – 2012-07-13 23:19:54

2

var egg = {}是一个对象,但它不是一个对象的实例。

在JavaScript中,简单地说这种方式基本上是js的单例的概念,意味着它正是它的意思。

//this is a js singleton, and all properties of this object are public. 
var egg = { 
    name: 'humpty', 
    smush: function() { console.log('splat!'); }, 
    weight: '4oz' 
}; 
console.log(egg.weight); //4oz 

而,较传统型对象将被使得它的功能,然后可以实例化:

var Egg = function(name, weight) { 
    var name = name; 
    this.smush = function() { console.log('splat!'); } 
    this.weight = weight; 
}; 
var e2 = new Egg('dumpty','6oz'); 
console.log(e2.name); //will not return name. (since i wrote var name and not this.name, its "private" and thus cannot be accessed.) 
console.log(e2.weight); //4oz 
+0

“未定义,因为我们有范围”是什么意思?你从未分配过'this.name = name'。另外,为什么当已经有一个(参数)时创建一个局部变量名称。回答这个问题,但它不是很清楚 – 2012-07-13 23:17:43

+0

哦,我只是做了一个说明,在我们的Egg()对象中,你可以通过区分var x和this.x来阻止仅仅是公开的事情......我将重写它更清楚 – Kristian 2012-07-14 00:21:37

10

的上述两个实例都是正确的。把它简单地放在JavaScript中是一个对象。类不存在,但有很多方法可以模仿它们。我最喜欢的方法如下:现在

var myClass = function() { <----------------------------- class declaration 

      var prop1, 
       prop2, <------------------------------------ private properties 
       prop3; 

      var addMe = function(arg1, arg2) { <------------ private method 
       var result = arg1 + arg2; 
       return result; 
      } 

      var obj = { <------------------------------------- constructor method 
       Prop1: prop1, 
       Prop2: value2, <----------------------------- public properties 
       Prop3: value3, 

       Method: function() { <------------------------ public method 
        obj.prop3 = obj.prop1 + obj.prop2; 
        return obj.prop3; 
       } 
      } 

      obj.Prop4 = addme(prop1, prop2); <-------------- public property set 
                   with the private method 
      return obj; 
    } 

    var myClassObj = new myClass; 

myClassObj是MyClass的一个对象有四个公共属性 PROP1,PROP2,Prop3,Prop4和一个叫方法