var someuser = {
name:'suichen',
display: function(words) {
console.log(this.name+' says '+words);
}
};
var foo = {
name:'foobar'
};
someuser.display.call(foo, 'hello');
call和apply的功能是以不同的对象作为上下文来调用某个函数。简而言之,就是允许一个对象去调用另一个对象的成员函数。
call以参数列表来接受被调用函数的参数,而apply以数组来接受被调用函数的参数。
如何改变被调用函数的上下文呢?可以使用call或apply方法。也可以使用bind方法来永久地绑定函数的上下文,使其无论被谁调用,上下文都是固定的。
使用bind绑定参数列表:
function Foo() {
}
Object.prototype.name='My Object';
Foo.prototype.name = 'Bar';
var obj = new Object();
var foo = new Foo();
console.log(obj.name);
console.log(foo.name);
console.log(foo.__proto__.name);
console.log(foo.__proto__.__proto__.name);
console.log(foo.__proto__.constructor.prototype.name);
我们把JavaScript中的对象分为三类,一类是用户创建的对象,一类是构造函数对象,一类是原型对象。
在JavaScript中,继承是依靠一套叫做原型链的机制实现的。属性继承的本质就是一个对象可以访问到它的原型链上任何一个原型对象的属性。
这三类对象中每一类都有一个__proto__属性,它指向该对象的原型。
对象的复制:
Object.prototype.clone = function() {
var newObj = {};
for (var i in this) {
newObj[i] = this[i];
}
return newObj;
}
var obj = {
name: 'suichen',
likes: ['node']
};
var newObj = obj.clone();
obj.likes.push('python');
console.log(obj.likes); //['node', 'python']
console.log(newObj.likes); //['node', 'python']
Object.prototype.clone = function() {
var newObj = {};
for(var i in this) {
if (typeof(this[i]) == 'object' || typeof(this[i]) == 'function') {
newObj[i] = this[i].clone();
} else {
newObj[i] = this[i];
}
}
return newObj;
}
Array.prototype.clone = function() {
var newArray = {};
for(var i in this) {
if (typeof(this[i]) == 'object' || typeof(this[i]) == 'function') {
newArray[i] = this[i].clone();
} else {
newArray[i] = this[i];
}
}
return newArray;
}
Function.prototype.clone = function() {
var that = this;
var newFunc = function() {
return that.apply(this, arguments);
};
for (var i in this) {
newFunc[i] = this[i];
}
return newFunc;
};
var obj = {
name:'suichen',
likes:['node'],
display: function() {
console.log(this.name);
}
};
var newObj = obj.clone();
console.log(newObj);
console.log(newObj.display());