【问题标题】:How to add Object.prototype.x? set to enumerable:false如何添加 Object.prototype.x?设置为可枚举:假
【发布时间】:2015-05-08 09:36:47
【问题描述】:

$('example')

控制台日志foo {word: "example", letter: function}

                                  ^

日志显示letter是foo的原型函数

var foo,$;

(function() {

    foo = $ = function(word) {
        return new foo(word);
    };

    var foo = function(word) {
        //#A
        this.word=word;
        console.log(this.word);
        return this;
    };


    foo.fn = foo.prototype = {

        letter: function(n) {
            console.log(this.word[n]);
            return this;
        }
    };

}());

我好像看不到$.fnfoo.fn

console.log($.fn);     //fn is undefined
console.log(foo.fn);   //foo is undefined

console.log($.prototype); //shows me constructor and __proto__

为什么?如果我想稍后在代码中添加更多原型函数怎么办?为什么它像 Array.prototype.something=function... 的魅力一样起作用,但不是这段代码?

我想知道如何做到这一点,正如我上面所说的,我可以看到 letter 函数,但如果不是将字母声明放在原型中,而是将 //A 替换为

Object.defineProperty(this,"letter",{
    value:
        function(n) {
            console.log(this.word[n]);
            return this;
        }
    ,enumerable:false});

letter 隐藏在 foo 对象内部,并使原型为空。我似乎无法访问原型对象,我不想在控制台日志中看到额外的 function junk 如果我确实添加了一些东西,我会将它视为垃圾,除非我在//A 所在的位置添加它..

但是我留下了一些我无法(理解如何)用新方法修改的东西。

【问题讨论】:

    标签: javascript syntax prototype enumerable


    【解决方案1】:

    您问题的标题似乎与问题无关,但我们开始:

    foo = $ = function(word) {
        return new foo(word);
    };
    
    var foo = function(word) {
        ...
    };
    

    等价于

    var foo;
    foo = $ = function(word) {
        return new foo(word);
    };
    
    foo = function(word) {
        ...
    };
    

    即您正在创建一个局部变量foo,它会遮蔽外部变量。因此,您永远不会分配给全局 foo,也永远不会在函数之外公开 foo.fn

    正在将函数分配给$,但您从未将fn 分配给该函数。


    如果我正确理解您想要做什么,那么您必须重命名变量,使其不会影响外部变量,并在正确的函数上公开fn(如果您重命名变量,这将自动发生):

    var foo,$;
    
    (function() {
    
        foo = $ = function(word) {
            return new InnerFoo(word);
        };
    
        var InnerFoo = function(word) {
            //#A
            this.word=word;
            console.log(this.word);
            return this;
        };
    
    
        foo.fn = InnerFoo.prototype = {
    
            letter: function(n) {
                console.log(this.word[n]);
                return this;
            }
        };
    
    }());
    

    【讨论】:

    • 这解释了为什么我无法访问它的原型。在你的帮助下,我发现我可以设置 Object.defineProperty($.fn,'letter',{enumerable:false}) 所以我现在更接近我的目标 +1
    • 你会选择什么标题?我显然很困惑。它不会帮助其他用户遇到标题不佳的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2016-04-03
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多