将原型函数绑定到此的方式不那么冗长
Less verbose way of binding prototype functions to this
我使用以下声明类的范例:
var myNamespace = myNamespace || {};
(function () {
myNamespace.MyClass = function () {
if (!(this instanceof myNamespace.MyClass)) {
return new myNamespace.MyClass();
}
this.field = 17;
this.foo = this.foo.bind(this);
this.bar = this.bar.bind(this);
};
myNamespace.MyClass.prototype.foo = function(){
console.log(this.field + 1);
};
myNamespace.MyClass.prototype.bar = function(){
console.log(this.field + 2);
};
})();
我使用prototype
来避免在每次实例化时重新定义对象方法,并使代码更干净——将类字段与其逻辑分离
我在每个方法上调用bind
,以避免出现this
在方法内部指向错误的严重错误。
它很有效,但很容易出错——我必须记住对每个方法调用bind
,而且它太冗长了,尤其是当有两个以上的方法时。
是否有更干净的方法来声明这些类型的函数(绑定到其类型的this
,并在prototype
上声明)
*我知道"干净"并没有很好地定义——一个简单的度量标准就是代码长度。
你不应该那样绑定你的方法——你在每个实例上创建新的函数,而你真的应该在原型上有方法来节省内存。如果你创建了100个实例,那么你就创建了200个新函数!像这样的简单模式更常见,也会很好地工作:
var myNamespace = myNamespace || {};
myNamespace.MyClass = (function() {
function MyClass() {
this.field = 17;
}
MyClass.prototype = {
constructor: MyClass,
foo: function() {
console.log(this.field + 1);
},
bar: function(){
console.log(this.field + 2);
}
};
return MyClass;
}());
在声明类之后附加到您的命名空间:
var myNamespace = myNamespace || {};
(function () {
var MyClass = function () {
this.field = 17;
};
MyClass.prototype.foo = function(){
console.log(this.field + 1);
};
MyClass.prototype.bar = function(){
console.log(this.field + 2);
};
this.MyClass = MyClass;
}).call(myNamespace);
通过以命名空间作为作用域调用IIFE,可以通过在this
对象上公开类来保持模块的干净。
您可以在一次赋值中压缩一些原型定义,并将命名空间传递到函数调用中。
var myNamespace = myNamespace || {};
(function () {
function MyClass() {
this.field = 17;
};
MyClass.prototype = {
foo: function () {
console.log(this.field + 1);
},
bar: function () {
console.log(this.field + 2);
}
};
})(myNamespace);
相关文章:
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- JavaScript对象不是从原型链继承的
- 得到"未定义不是函数“;使用显示原型图案时出错
- JavaScript Array unshift() 以一种不可变的方式
- 我可以在不连接按钮的情况下以角度方式使用zclip吗
- 为什么我要将函数添加到对象原型中,而不是将其添加到对象中
- 将不同上传的文件显示为缩略图或任何其他方式
- Y组合器如何以编程方式计算不动点
- Javascript不调用原型方法
- 如果变量不是't已传递给函数.这是正确的方式吗
- jQuery的工作方式不一样
- 将原型函数绑定到此的方式不那么冗长
- jQuery 脚本在以编程方式(不是由用户)更改选择选项时不起作用
- 以两种不同的方式编写函数:一种方式会导致 TypeError,另一种方式不会.为什么
- 变量、数组和 for 循环的行为方式不尽如人意
- javascript中的数组工作方式不正确
- jquery的执行方式不正确
- 我的联系方式不起作用
- Angularjs在控制器之间共享数据(服务方式)——不调用监视器
- 为什么提交按钮在我的联系方式不工作