我刚刚注意到,当我记录当前正在处理的对象的实例时,我看到原型函数在它的属性之后(它只有一个)。这让我觉得我做错了什么。
这就是我设置原型的方式。
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
对象的样子,日志中没有显示原型函数
答案 0 :(得分:6)
您的代码没有出现任何问题。我确定仅在少数实例属性时才会将原型属性列为方便。扩展记录的对象会显示所有属性都应该是它们的位置。
答案 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/