1

考虑以下代码:

var AryUser = new Array();
AryUser.prototype.HasUser = function() {
  if(this.length > 0)
    return true;
  else
    return false;
}

我已经在我的 Node.js 项目中的一些对象上使用原型扩展。我遇到了一篇文章,其中指出这是不好的做法。在执行此类功能期间是否会在服务器上产生开销?

谁能告诉我是什么原因?(任何官方文件推荐都会有很大帮助)

4

3 回答 3

3

您没有在上面提供的示例中扩展任何原型。该prototype属性仅存在于函数上 -AryUser是一个数组。上面的代码会抛出一个ReferenceError.

您可能希望了解原型继承在 JavaScript 中的工作原理。阅读以下答案:https ://stackoverflow.com/a/8096017/783743

话虽如此,扩展原生函数的原型(如Function,ObjectArray. 这是因为您可能会覆盖其他人的函数,可能会破坏他们的代码。

扩展本机函数原型仅推荐用于猴子补丁。阅读以下文章,了解扩展原生函数原型的优缺点

于 2013-02-12T07:50:54.013 回答
1

我知道,我迟到了。我有东西要分享。这是实现您想要做的事情的一种方法。

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
于 2015-01-09T08:45:25.233 回答
-1

也许这些文章提供了一些见解:

底线是:扩展你不拥有的对象的原型如果浏览器发生变化,它就不是面向未来的,并且你会遇到其他人做同样事情的库的问题。

于 2013-02-12T07:57:19.103 回答