用Javascript编写一个扩展方法
Writing an Extend Method in Javascript
我想知道是否有人可以帮助我理解为什么有必要添加以下行…
if (!obj.hasOwnProperty(key)) continue;
…在以下方法中:
extend: function(obj) {
// shallow copy
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
this[key] = obj[key];
}
}
当您使用for-in
循环遍历对象的属性名称时,您将看到所有可枚举属性的,包括对象从其原型继承的属性。实现该方法的人似乎不想复制从原型继承的属性,因此只包含对象本身直接拥有的属性。
下面是一个例子:
function Thing(name) {
this.name = name;
}
Thing.prototype.speak = function() {
console.log("I'm " + this.name);
};
Thing.prototype.infoForAllThings = 42;
var t1 = new Thing("Fred");
console.log(t1.name); // "Fred"
console.log(t1.infoForAllThings); // "42"
t1.speak(); // "I'm Fred"
var t2 = extend(t1); // (Where `extend` is like your function,
// but returns the object rather than using `this`
console.log(t2.name); // "Fred"
console.log(t2.infoForAllThings); // "undefined"
t2.speak(); // Error
在上面,t1
继承了其原型的infoForAllThings
和speak
属性,当创建t1
时,它被设置为Thing.prototype
。但是extend
函数使用hasOwnProperty
将它们过滤掉,因此不会将它们复制到它创建的副本中,因此它们不存在于t2
上。t2
有name
因为它被直接赋值为对象,它不是来自原型,但其他的来自原型,所以不会被复制。
相关文章:
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 在这个使用hasOwnProperty的对象扩展程序中有一个错误,I'我不确定那个bug是什么,也不确定这个扩展
- 打开一个选项卡,并在firefox网络扩展中向其发出POST请求
- 制作一个chrome扩展,替换css和js元素
- Chrome扩展和Angular:我可以把Chrome.runtime.sendMessage变成一个同步函数吗
- Firefox扩展开发:如何在内容脚本中创建一个全局函数,以便其他加载的脚本文件可以访问它
- 检测是否从另一个扩展安装了一个扩展
- 在一个扩展了Sonata管理twitch/Symfony 2的twitch中调用javascript(ExtJS)的问题
- 如何将消息从 chrome 扩展程序发送到另一个扩展程序
- 如果 Chrome 扩展程序崩溃,如何让另一个扩展程序重新加载崩溃的扩展程序
- 使用交叉骑手时,使用多个文件而不是一个扩展名.js文件
- 定义一个扩展Function的类
- 如何用另一个扩展现有的js数组
- 创建一个扩展另一个对象的对象
- 如何构建一个扩展,以保存HTML表单的值到电子表格使用应用程序脚本
- 用Javascript编写一个扩展方法
- 使用webRequest来取消由另一个扩展发出的请求
- 我可以写一个“扩展”吗?Javascript中的继承函数
- Chrome扩展:让一个扩展监听页面上的事件
- 解析平台-调用JavaScript函数定义在一个扩展字符串对象得到错误对象没有方法