call方法是js中比较重要的一个知识点,看了很多介绍也未必能够对他有个深刻的理解,那就让我们看看他的实现原理吧。
//这个方法只是简单的模拟了call的实现原理,对context是否非空,参数对象素组字符串的类型都没有做处理。
Function.prototype.call2 = function(context) {
context.fn = this;
var args = [];
for(var i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}
//args数组自动toString处理
eval('context.fn(' + args +')');
delete context.fn;
}
原型链继承的一般写法,一直感觉不够简洁
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
MyObject.prototype.getName = function() {
return this.name;
};
MyObject.prototype.getMessage = function() {
return this.message;
};
偶然发现的call方法优化,感觉高大上很多
function MyObject(name, message) {
this.name = name.toString();
this.message = message.toString();
}
(function() {
this.getName = function() {
return this.name;
};
this.getMessage = function() {
return this.message;
};
}).call(MyObject.prototype);