扫码关注官方订阅号
在JavaScript高级程序设计中第五章引用类5.5.5节,118页,使用call()来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。这其中对象和方法的耦合关系怎么理解啊?求大神帮忙解答。
人生最曼妙的风景,竟是内心的淡定与从容!
假设现在有个对象a = {name: 'isayme'}, 如果想提供一个接口打印name属性, 怎么做?
a = {name: 'isayme'}
name
方法1, 给对象定义一个函数(当然也可以用原型链, 此处仅简单化):
方法1
a = {name: 'isayme'}; a.print = function() { console.log('NAME: ' + this.name); } a.print(); // NAME: isayme
方法2, 打印的函数不再作为a的属性, 而是单独定义:
方法2
a
a = {name: 'isayme'}; print = function() { console.log('NAME: ' + this.name); } // 注意此处调用方式与方法1的不同 print.call(a); // NAME: isayme
比较两个方法, 方法2中打印函数print与对象a完全无关(两者无依赖关系), 即低耦合; 方法1中的print是对象a的属性, 两者有明显的依赖关系, 即高耦合.
print
低耦合
高耦合
注: 低耦合/高耦合 是相对的概念~
低耦合有什么优点呢? 假如又有一个对象b = {name: 'heaven'}也想打印他的name, 怎么办? 如果是方法1, 那么b只好自己也加一个print属性. 但这样就相当于每个对象都会有自己独立的print函数, 重复的代码会加重后期维护困难; 如果是方法2, b只要这样print.call(b)就可以了! 是不是很简单!
b = {name: 'heaven'}
b
print.call(b)
javascript里的函数和对象关系比较微妙,比如一个函数 function sayColor() { alert(this.color); } sayColor没有绑定到其他对象(这个函数是全局的),则this指代window。那么实际上sayColor函数就和window对象耦合在一起了。
类似的 var o = {}; o.sayColor = function () { alert(this.color); } this就指代o对象了。
但call函数可以改变这个耦合,随意替换this的指代,如
window.color = "red"; var o = { color: "blue" };
function sayColor() { alert(this.color); }
sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
参考 http://www.w3cmm.com/javascript/apply-call.html
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
假设现在有个对象
a = {name: 'isayme'}, 如果想提供一个接口打印name属性, 怎么做?方法1, 给对象定义一个函数(当然也可以用原型链, 此处仅简单化):方法2, 打印的函数不再作为a的属性, 而是单独定义:比较两个方法,
方法2中打印函数print与对象a完全无关(两者无依赖关系), 即低耦合;方法1中的print是对象a的属性, 两者有明显的依赖关系, 即高耦合.注:
低耦合/高耦合是相对的概念~低耦合有什么优点呢?
假如又有一个对象
b = {name: 'heaven'}也想打印他的name, 怎么办?如果是
方法1, 那么b只好自己也加一个print属性. 但这样就相当于每个对象都会有自己独立的print函数, 重复的代码会加重后期维护困难;如果是
方法2,b只要这样print.call(b)就可以了! 是不是很简单!javascript里的函数和对象关系比较微妙,比如一个函数
function sayColor() {
alert(this.color);
}
sayColor没有绑定到其他对象(这个函数是全局的),则this指代window。那么实际上sayColor函数就和window对象耦合在一起了。
类似的
var o = {};
o.sayColor = function () {
alert(this.color);
}
this就指代o对象了。
但call函数可以改变这个耦合,随意替换this的指代,如
window.color = "red";
var o = {
color: "blue"
};
function sayColor() {
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
参考 http://www.w3cmm.com/javascript/apply-call.html