在Javascript构造函数中定义属性的正确方法

问题描述:

所以我对JavaScript(来自强大的java背景)不熟悉,我想知道在类或构造函数中定义属性或变量的正确方法。在Javascript构造函数中定义属性的正确方法

function RootNode(sTitle, authName, storyNum){ 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

function RootNode(sTitle, authName, storyNum){ 

    var sTitle = sTitle; 
    var authName = authName; 
    var storyNum = storyNum; 
    var creationDate = new Date(); 
} 
+0

#1。在#2中创建局部变量。 – 2015-03-03 02:53:44

+0

JavaScript中没有类(至少尚未)。 – 2015-03-03 02:54:28

+0

当有,我不会使用它们。 https://www.youtube.com/watch?v=PSGEjv3Tqo0 – m59 2015-03-03 02:55:10

答案很简单:使用第一个


更详细的解答

的第一个片段设置sTitleauthNamestoryNumcreationDate属性。

第二个片段创建4个局部变量并设置它们的值。这些变量在函数外部是不可访问的。

可以使用局部变量和对象变量一起这样的:

function RootNode(sTitle, authName, storyNum) { 
    this.sTitle = sTitle; // you can access this variable when you . into the object 

    var privateVariable = 'You cannot see this variable when you . into the object directly'; 
    this.methodInObject = function() { 
     return privateVariable; // but you can access the variable from the function 
    } 
} 

注:你可能想在构造函数的末尾添加return this;,使其返回对象你构建的。

UPDATE:%的评论,你做必须return this;为使用new RootNode这是否自动将


进一步阅读(+1使用自动的:)?)

+1

返回'this'是不必要的,因为'new'已经为你做了。 – plalx 2015-03-03 03:18:58

+0

@plalx感谢您指出。我不知道(或者如果我知道了,我会忘记)。我已经开悟了。 – 2015-03-03 03:28:00

+0

构造函数必须返回一个对象。如果没有这样做的返回语句,它将返回由* this *引用的对象。有些人喜欢为清晰起见而使用'return this',尽管没有参数(例如没有返回值,如果在调用中省略* new *,函数将返回* undefined * - 尽早破解)。 – RobG 2015-03-03 03:36:49

可以使用的第一个样式,但我个人比较喜欢这样的:http://www.w3schools.com/js/js_objects.asp

+0

我认为OP正试图以“伪古典”的方式使用JS。 – 2015-03-03 02:55:25

+0

w3schools ...那些可怕的人... – Travis 2015-03-03 02:58:20

+0

@jsve“伪古典”庄园会是什么?来自java和c的强大背景是否有一种不同的方法,我应该给予javascript的观点? – crazyCoder 2015-03-03 02:58:39

第一种方式是正确的。

function RootNode(sTitle, authName, storyNum) { 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

然而,这种方法不是很喜欢的一类,它更多的是独特的对象。以这种方式定义对象更像是一个Java类。

function RootNode(sTitle, authName, storyNum) { 
    //your constructor 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

RootNode.prototype.myMethod = function() { 
    //my code 
} 

这种模式很有用,因为它允许多个实例化,而不需要为属性复制内存。另外,如果你想创建子类,这是必要的。阅读this了解原型和构造函数属性

+0

为什么'var RootNode = function'比直接函数声明更好?这实际上更糟,因为构造函数是未命名的。用你提出的构造,'RootNode.name'将返回空字符串。 – plalx 2015-03-03 03:20:58

+0

这是一个很好的观点。我的重点是原型。我会编辑它。 – 2015-03-03 03:23:16