User.prototype.save 和 User.get 两种定义方法方式的区别?

2014-05-07 07:08:44 +08:00
 WildCat
http://github.com/nswbmw/N-blog/blob/master/models/user.js
的第13行和50行。

User.prototype.save = function(callback) { ...

User.get = function(name, callback) { ...

是不是 User.prototype.save ,必须实例化才能调用?
User.get则不用?
4204 次点击
所在节点    Node.js
9 条回复
bolasblack
2014-05-07 08:44:35 +08:00
prototype 里的方法只有构造函数的实例可以使用

不过你也可以这么干 `User.prototype.save.call(userInstance, callback)`
zhujinliang
2014-05-07 09:14:43 +08:00
User.prototype.save 可以理解为
class User
{
public function save()

}
User.get 可以理解为
class User
{
public static function get();
}
jsonline
2014-05-07 09:18:30 +08:00
prototype 是为了方便继承。
一个是成员方法,一个是类方法
isayme
2014-05-07 11:39:17 +08:00
JS菜鸟, 最近貌似看到类似问题:

User.prototype.save 需要new出来的实例才可以调用; 所有的new出来的实例共享这个函数(同一个函数实例).

User.get 可以直接调用; 每个new出来的实例都初始化一次这个函数(函数实例不同), 所以占用内存多点...

如有纰漏, 坐等大神指正...
chcone
2014-05-08 00:42:42 +08:00
@isayme

User的实例是没有get函数的,get函数没有在User构造体里定义,就像下面这样:

function User(...) {
...
this.get = function () {};
...
}

而User.get只是User对象里的一个函数而已。
lijsh
2014-05-08 15:02:55 +08:00
@isayme 第一句没问题,包括保存、删除和更新这些操作都是针对一个特定的实例的,是实例上的方法,所以通过原型共享这些方法;
至于User.get,注意这个get方法是挂在User这个构造函数上的,和new出来的实例没关系,是为了针对User类而定义出来的;类似的,你可以把获取用户总数的方法也挂在User上,这些方法只与整个类有关,与实例无关。
isayme
2014-05-20 14:24:02 +08:00
@chcone
@lijsh
竟然今天才提醒有回复...
不过, 过了些天, 对原型的理解更深了一些~
正如二位所说, new出来的实例没有 User.get 函数. 只可以通过 User.get() 直接调用此函数.

但是, 谁能给我解释下下面的情况 ( 注释后为输出结果 ) :

Function.prototype === Function.__proto__ // true
typeof Function.prototype // "function"
Function.prototype instanceof Function // false
lijsh
2014-05-20 15:27:28 +08:00
@isayme 我先说第三行吧,instanceof可以用作判断实例与构造函数的关系,如果inst是ctor的实例,即inst继承自ctor.prototype,则inst instanceof ctor返回true;但这一行里你判断的却是原型(而不是实例)和构造函数的关系,自然是返回false了。

第一行涉及到Function这个内置构造函数,它是函数对象的构造函数(就像String是字符串的构造函数),但它自己也是函数对象,所以它的构造函数就是自己,即它自己是自己的实例(Function.constructor === Function;及Function instanceof Function均返回true);既然现在实例和构造函数相等,而一般来说构造函数的prototype属性和实例的__proto__属性也相等,于是就有Function.prototype === Function.__proto__;

第二行是想问Function.prototype为什么是函数对象吗?我也不知道,不过在调试台看到它是一个名为Empty的函数,继承自Object.prototype。

推荐一篇文章http://www.360weboy.com/front/prototype/,关于Function.prototype讲得比较透彻。
lijsh
2014-05-20 21:50:42 +08:00
@isayme 额,Function.prototype作为所有函数的原型,它只能是函数对象啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/111433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX