如果我们在任何对象的Node.js中扩展原型,会出现什么问题?
考虑下面的代码:
var AryUser = new Array(); AryUser.prototype.HasUser = function() { if(this.length > 0) return true; else return false; }
我已经在我的Node.js项目中使用扩展的一些对象的原型。 我遇到了一篇文章 ,说这是不好的做法。 它是否会在执行这些function时在服务器上创build开销?
谁能告诉我是什么原因? (任何正式的文件转介将有很大的帮助)
您在上面提供的示例中没有扩展任何原型。 prototype
属性只存在于函数中 – AryUser
是一个数组。 上面的代码会抛出一个ReferenceError
。
您可能希望了解原型inheritance如何在JavaScript中工作。 阅读以下答案: https : //stackoverflow.com/a/8096017/783743
这就是说,扩展原生函数的原型,如Function
, Object
和Array
是一个不好的做法。 这是因为你可能会覆盖别人的function,可能会破坏他们的代码。
扩展本机函数原型只推荐用于猴子修补 。 阅读以下文章,了解扩展本地函数原型的优缺点 。
我知道,我迟到了。 我有一些东西要分享。 这是实现你想要做的事情的一种方法。
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
也许这些文章提供了一些见解:
- http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
- http://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/
- http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/
底线是:扩展你不拥有的对象的原型,如果浏览器改变,这是不是未来的certificate,并且你从其他人的图书馆遇到问题。