JavaScript:在控制台中显示的原型函数

时间:2014-08-01 07:13:21

标签: javascript

我刚刚注意到,当我记录当前正在处理的对象的实例时,我看到原型函数在它的属性之后(它只有一个)。这让我觉得我做错了什么。

enter image description here

这就是我设置原型的方式。

MF = function(x){
    if(!(this instanceof MF)) return new MF(x);
    this.node = x;
}
MF.prototype = {
    show: function(display){
        display ? this.node.style.display = display : this.node.style.display = 'block';
    },
    hide: function(){
        this.node.style.display = 'none';
    }
}

console.log(MF(window));

我也尝试使用Object.create()进行设置,如this answer中所述,这在我的情况下没有多大意义,但绝望的时候会要求绝望的尝试。

为什么我在实例中看到原型方法,我该如何解决这个问题呢?

编辑:

例如,这里是jQuery对象的样子,日志中没有显示原型函数

enter image description here

2 个答案:

答案 0 :(得分:6)

您的代码没有出现任何问题。我确定仅在少数实例属性时才会将原型属性列为方便。扩展记录的对象会显示所有属性都应该是它们的位置。

chrome devtools

答案 1 :(得分:2)

显示原型对象是正常做法。而使用jQuery,这也是转载。只需致电console.dir($('div')),您就会在下面看到__proto__对象。你无法在控制台显示中隐藏原型功能。

这是我如何在我的库中实现扩展原型的类:

Pinch.$ = function(selector, parent) {
    if (!(this instanceof arguments.callee)) {
        var callee = arguments.callee,
            newObject = Object.create(callee.prototype);
        callee.apply(newObject, callee.arguments);
        return newObject;
    }

    // --- logic ---

    return this;
}
Pinch.prototype = Object.create({
    is: function() {},
    // --- methods ---
    empty: function() {}
});

然后如果你想用新方法扩展你的原型:

Pinch.$.prototype = Pinch.Util.extend(Pinch.$.prototype, {
    newMethods: function() {}
}, {
    oneMoreMethod: function() {}
});

extend()实现你可以在许多图书馆找到并只是谷歌搜索"扩展javascript"

使用Object.create作为扩展名的第二种方式:

Pinch.$.prototype = Object.create(Pinch.$.prototype, {
    newMethods: function() {}
});

但实际上,你无法从控制台隐藏原型对象。只有当你开始使用基于当地范围的黑客和技巧时才会这样做。

UPD:您可以使用Object.defineProperties()隐藏元素 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties

例如:

var MF = function () {};

MF.prototype = Object.create({});

Object.defineProperties(MF.prototype, {
    thisWillShow: {
        value: function () {},
        enumerable: true
    },
    thisWillNotShow: {
        value: function () {},
        enumerable: false
    }
});
console.log(new MF());

这里的工作示例 - http://jsfiddle.net/uRVFW/