考虑以下代码:
var AryUser = new Array();
AryUser.prototype.HasUser = function() {
if(this.length > 0)
return true;
else
return false;
}
我已经在我的 Node.js 项目中的一些对象上使用原型扩展。我遇到了一篇文章,其中指出这是不好的做法。在执行此类功能期间是否会在服务器上产生开销?
谁能告诉我是什么原因?(任何官方文件推荐都会有很大帮助)
考虑以下代码:
var AryUser = new Array();
AryUser.prototype.HasUser = function() {
if(this.length > 0)
return true;
else
return false;
}
我已经在我的 Node.js 项目中的一些对象上使用原型扩展。我遇到了一篇文章,其中指出这是不好的做法。在执行此类功能期间是否会在服务器上产生开销?
谁能告诉我是什么原因?(任何官方文件推荐都会有很大帮助)
您没有在上面提供的示例中扩展任何原型。该prototype属性仅存在于函数上 -AryUser是一个数组。上面的代码会抛出一个ReferenceError.
您可能希望了解原型继承在 JavaScript 中的工作原理。阅读以下答案:https ://stackoverflow.com/a/8096017/783743
话虽如此,扩展原生函数的原型(如Function,Object和Array. 这是因为您可能会覆盖其他人的函数,可能会破坏他们的代码。
扩展本机函数原型仅推荐用于猴子补丁。阅读以下文章,了解扩展原生函数原型的优缺点。
我知道,我迟到了。我有东西要分享。这是实现您想要做的事情的一种方法。
function UserArray() {
Array.call(this);
}
UserArray.prototype = Object.create(Array.prototype);
UserArray.prototype.constructor = UserArray;
UserArray.prototype.hasUser = function() {
return this.length > 0;
};
var userArray = new UserArray();
userArray.hasUser();//false;
userArray.push({name: 'foo'});
userArray.hasUser();//true;
userArray instanceof UserArray;//true
userArray instanceof Array;//true
typeof Array.prototype.hasUser === 'undefined'//true
也许这些文章提供了一些见解:
底线是:扩展你不拥有的对象的原型如果浏览器发生变化,它就不是面向未来的,并且你会遇到其他人做同样事情的库的问题。