2013-07-17 68 views
-4

我已经看过一些教程,但我仍然在努力处理下面的代码,有人可以请解释这段代码。你能解释一下每个部分是什么以及它做什么。不明白面向对象编程

function Person (name, age) { 
    this.name = name; 
    this.age = age; 
} 


var ageDifference = function(person1, person2) { 
    return person1.age - person2.age; 
} 

var alice = new Person("Alice", 30); 
var billy = new Person("Billy", 25); 

// get the difference in age between alice and billy using our function 
var diff = 
+0

查看本教程http://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep并阅读点4.4和4.5。这些应该已经解释了这段代码中发生了什么。 –

+0

缺少像'ageDifference(爱丽丝,比利);'在最后。 – Niko

+0

这对我来说不是很重要。 – moonwave99

回答

2
function Person(name, age) { // define a _constructor_ called _Person_ 
    this.name = name;  // constructor sets instance property _name_ 
    this.age = age;   // constructor sets instance property _age_ 
} // when invoked with _new_, this creates an.. 
    // ..Object which is an instance of Person 

var ageDifference = function (person1, person2) { // a function (expression) 
    return person1.age - person2.age; // which returns the difference.. 
}          // ..between _age_ properties 

var alice = new Person("Alice", 30); // new instance of _Person_ 
var billy = new Person("Billy", 25); // another new instance 
/* _alice_ now looks like | _billy_ now looks like 
    {      |  { 
     age: 30,   |   age: 25, 
     name: "Alice"  |   name: "Billy" 
    }      |  } 
*/ 
// get the difference in age between alice and billy using our function 
var diff = ageDifference(alice, billy); // passing the instances from above.. 
             // ..into the function expression 
+0

不是迂腐,但'ageDifference'只是一个功能,而不是一种方法。 – Niko

+0

@NIKi重新措辞 –

+0

是不是更多的是你将对象作为参数传递给函数'ageDifference()'而不是将函数应用于对象? – insertusernamehere

0

JavaScript是不写的面向对象的最佳语言。基本上,你所做的是:你创建一个新的objectnew运营商。

What is the 'new' keyword in JavaScript?

所有此。[变量]设置器将存储在该对象。所以当你拨打new Person函数中的所有this赋值都将作为一个对象存储,所以这个对象(它就像一个地图)将具有键nameage与分配的值。

所以爱丽丝会{ name : "Alice", age : 30 }和比利将{ name : "Billy", age : 25 }

导致JavaScript没有类型检查,你可以简单地做:ageDifference({age: 20},{age: 30});,它仍然可以工作。这就是为什么JavaScript不是最好的面向对象的语言。

(你可以使用打字原稿编写面向javascript对象:http://www.typescriptlang.org/

0

此代码显示在顶部,用于通过提供的参数和nameage创建Person对象contsructor。这个对象可以被赋予更多的属性,比如头发的颜色,身高,体重等等。通过使用这些对象,您可以简单地将所有对象存储在数组或列表中,这将提供一个伪数据库用于人口普查局追踪人员。面向对象的编程主要是创建对象来存储数据,而不是主要依赖于变量之前的每个人的名字变量。

例如,而不是:

var ericName = 'Eric'; 
var ericAge = '22'; 

你可以这样做:

var eric = new Person('Eric', '22'); 

,这将创建存储在变量eric Person对象。请致电eric.nameeric.age访问他的年龄。面向对象的程序设计简化了很多变量,只有少数变量,并且有许多方法来访问他们的信息并对其进行修改。

下段:

var ageDifference = function(person1, person2) { 
    return person1.age - person2.age; 
} 

实际上应该写成:

function getAgeDifference(person1, person2) { 
    return person1.age - person2.age; 
} 

为了让两个人之间的年龄差距,你会打电话getAgeDifference(alice, billy);。这将调用getAgeDifference方法,该方法将使用它们的age属性为您提供更多信息。

诸如Java,C++,Objective-C之类的面向对象语言也使用类来帮助将相关代码的各个部分分成不同的类或文件。这个类的想法是非常有用的,但很难理解,如果你想了解很多关于它的知识,我会建议你拿起一本关于特定语言的书,并根据它提供的信息来给你一个关于如何写面向对象的代码和一些示例和指导,说明如何做每一步。

祝你好运!

+0

'实际上应该改写为'为什么**应该**?这背后有推理吗? _function表达式有什么问题,特别是在这种情况下,你可能(在下一步的学习中)继续_prototypes_? –

+0

我将Java学习为一种面向对象的语言,它使用特定的方法(主要是accessor和mutator方法)与对象进行交互。虽然你可以将结果存储在一个变量中,但通常我不会因为我立即使用它,或者等到调用函数,直到需要它为止。 –

+0

对不起,我不明白“虽然你可以将结果存储在一个变量中”。什么结果? _function_被定义为_expression_,其引用是变量,_function expression_和_function declaration_之间的区别主要归结为它们可能被调用时的差异,并且如果它在定义之后,两者的作用几乎相同。另一个主要区别是,您可以在使用表达式时直接将_Objects_的属性指定为函数,而需要确保您没有命名空间冲突和额外的声明分配行 –