我有以下javascript:
var MyObject = (function() {
function Setup(args) {
this.prop1 = args.x;
this.prop2 = args.y
this.prop3 = this.prop1 + this.prop2;
this.Create = function() {
return 'a' + helperFunc();
}
function helperFunc() {
return this.prop3;
}
}
return {
init : function(args) {
var setup = new Setup(args);
setup.Create();
}
}
})();
$(function() {
MyObject.init(someArgs);
});
我的对象构建方法是一种好习惯吗?
尝试访问undefined
时,我在helperFunc中收到this.prop3
。
我还尝试将this.prop1 + this.prop2
分配给局部变量并使用函数返回此值,如下所示:
function Setup(args) {
var total;
this.prop1 = args.x;
this.prop2 = args.y
total = this.prop1 + this.prop2;
this.getTotal = function() {
return total;
};
this.prop3 = this.prop1 + this.prop2;
...
...当在helperFunc中调用它时,如下所示:
return this.getTotal();
..我得this.getTotal
不是函数
我一直在阅读对象创建和使用闭包来模仿私人成员等等,因为没有一种方法来定义对象,我感到困惑。
TBH - 我真的不明白这个结构:
var myObject = (function() { ... } ();
我已经看到它在jQuery插件中使用了很多但是第一个parenth在结尾处跟着空的parenth是什么意思呢?
非常感谢所传授的任何知识。
另外,我已经订购了关于javascript的Douglas Crockford书籍,直到它到来我需要尝试解决这个问题
答案 0 :(得分:4)
引用他提到的Xhalent's wonderful article(做得非常好,显然已经很好):
那是因为“this”的值是 不同于“这个”时的价值 对象已创建。
所以在你的情况下:
...
var _this = this.prop3;
function helperFunc() {
return _this;
}
...
可能会实现所需。
答案 1 :(得分:1)
我已经完成了一系列基本的javascript基础知识 - 这里介绍了对象和原型:
Javascript Object Instantation and Prototypes
我在这里深入研究闭包:Javascript Closures
希望他们有所帮助。欢呼声。答案 2 :(得分:1)
如果您的函数使用this
,则必须确保调用上下文正确。即使用this.helperFunc()
,而不只是helperFunc()
(但您还需要进行设置,以便定义this.helperFunc)。您示例中的helperFunc内的this
指示对象与Create()
中的指示对象不同。
您可以将其视为函数不是定义作为对象的成员,而称为作为对象的成员。
this
可能会解决三件事情,具体取决于具体情况。
new
关键字。window
),如果上述两者均未提供。如果在没有对象的情况下调用函数,就像在helperFunc
中调用this.Create
一样,this
将绑定到全局对象(window
,在浏览器中使用时)
考虑到这样的事情:
var o = {someVal:"hello"};
o.doSomething = function (){alert(this.someVal)};
调用o.doSomething()
显然会提醒“你好”。
鉴于:
var o2 = {someVal:"world"};
o2.someFunc = o.doSomething;
调用o2.someFunc()
会提醒“世界”,而不是“你好”,如果它是指向doSomething
o
成员的指针,就会发出警告。
并给出:
var someFunc = o.doSomething
someVal = "sailor"
致电someFunc()
会提醒“水手”。
另一个混淆点是this
直接使用Setup()
。当您使用new
调用函数时,this
未绑定到全局对象,而是绑定到Setup
对象的新实例。
对于上面的示例,这意味着调用new o.doSomething()
将警告“未定义”,因为为调用创建的新对象没有“someVal”成员。
答案 3 :(得分:0)
Mike Koss在this page的JS上有一个关于OOP的好教程。
我已经看到它在jQuery中使用了很多 插件,但第一个是什么 在父母后面是空父母 结束意味着什么?
第二组parenth立即调用你在第一组parenth中声明的函数。
你可以声明它并分别执行它(允许执行多次):
var myFunction = function() { alert("boo"); }; // Declare & instanciate
myFunction(); // Invoke
myFunction(); // Invoke again
或者在一行中做两件事:
(function() { alert("boo"); })(); // Can only invoke now, the function is anonymous and not stored anywhere.