V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WildCat
V2EX  ›  Node.js

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

  •  
  •   WildCat · 2014-05-07 07:08:44 +08:00 · 4228 次点击
    这是一个创建于 3873 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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则不用?
    9 条回复    2014-05-20 21:50:42 +08:00
    bolasblack
        1
    bolasblack  
       2014-05-07 08:44:35 +08:00   ❤️ 1
    prototype 里的方法只有构造函数的实例可以使用

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

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

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

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

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

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

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

    而User.get只是User对象里的一个函数而已。
    lijsh
        6
    lijsh  
       2014-05-08 15:02:55 +08:00
    @isayme 第一句没问题,包括保存、删除和更新这些操作都是针对一个特定的实例的,是实例上的方法,所以通过原型共享这些方法;
    至于User.get,注意这个get方法是挂在User这个构造函数上的,和new出来的实例没关系,是为了针对User类而定义出来的;类似的,你可以把获取用户总数的方法也挂在User上,这些方法只与整个类有关,与实例无关。
    isayme
        7
    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
        8
    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
        9
    lijsh  
       2014-05-20 21:50:42 +08:00 via Android
    @isayme 额,Function.prototype作为所有函数的原型,它只能是函数对象啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3291 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.