如果我们在任何对象的Node.js中扩展原型会有什么问题?

时间:2013-02-12 07:40:07

标签: javascript node.js coding-style standards

请考虑以下代码:

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

我已经在我的Node.js项目中的某些对象上使用了原型扩展。我遇到了article,这说明这是不好的做法。在执行此类函数期间是否会在服务器上产生开销?

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

3 个答案:

答案 0 :(得分:3)

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

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

据说,扩展原生函数的原型是一种不好的做法,例如FunctionObjectArray。这是因为你可能会覆盖别人的功能,可能会破坏他们的代码。

仅建议monkey patching扩展本机函数原型。阅读以下文章以了解the pros and cons of extending native function prototypes

答案 1 :(得分: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

答案 2 :(得分:-1)

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

底线是:扩展您不拥有的对象的原型,如果浏览器发生变化,它不会出现面向未来的问题,而且其他人也会遇到问题。