newJavaScript中的关键字在第一次遇到时会非常混乱,因为人们倾向于认为JavaScript不是面向对象的编程语言.
我最近读到了一个事实,即有可能在JavaScript中定义getter/setter.它似乎非常有用 - setter是一种'helper',可以在实际设置之前解析要设置的值.
例如,我目前有这个代码:
var obj = function(value) {
var test = !!value; // 'test' has to be a boolean
return {
get test() { return test },
set test(value) { test = !!value }
};
};
var instance = new obj(true);
Run Code Online (Sandbox Code Playgroud)
此代码始终转换value为布尔值.所以,如果你编码instance.test = 0,那么instance.test === false.
但是,要使其工作,您必须实际返回一个对象,这意味着新实例不是类型,obj而只是一个普通对象.这意味着更改原型obj对实例没有影响.例如,这并没有工作- instance.func是不确定的:
obj.prototype.func = function() { console.log(this.value); };
Run Code Online (Sandbox Code Playgroud)
因为instance不是类型obj.为了使原型函数工作,我想我不应该返回一个普通的对象,而是不返回任何东西,instance只有类型obj,就像常规构造函数一样.
那么问题是如何实现getter/setter?我只能找到描述如何将这些添加到对象的文章,而不是作为自定义类型的构造函数的一部分. …
我正在阅读KnockoutJS源代码.
我遇到了以下一行,我不确定我理解......
ko.utils = new (function () {
Run Code Online (Sandbox Code Playgroud)
一般来说,结构似乎是这样的:
ko.utils = new (function () {
// some variables declared with var
return {
export:value,
export:value
};
})();
Run Code Online (Sandbox Code Playgroud)
我不明白这个结构,为什么new需要?它有什么作用?它有用的是什么?
(我认为如果函数new在其名称之前调用它作为构造函数调用,并且如果它返回一个对象,则它与没有调用的函数相同new.)
更新:我在github上问了KnockoutJS团队,这就是我得到的:
我的猜测是史蒂夫只是不知道不需要它.回顾他最初的提交,我看到很多不必要的消息已被删除.