【发布时间】:2015-01-22 08:18:20
【问题描述】:
我的目标是创建一个 master_script.js。主要用于开发的处理程序文件。
此文件的一个小节专门用于自定义基础对象的原型:
- 字符串
- 号码
- 数组
- 对象
- 日期
- 功能
- 布尔值
所以当我写出我的代码块时......
/********************************************************/
Object.defineProperty(
Number.prototype,'len',
{get:function(){
str=this.toString()
return str.length
}}
)
/********************************************************/
n=123
o={123:'abc',abc:123}
/********************************************************/
console.log(
'n ⇒ ',n,
'\n n.len ⇒ ',n.len,
'\n n.__proto__ ⇒ ',n.__proto__
)
/********************************************************/
工作正常!
- 当我在 控制台 中展开
n.__proto__时,它会显示len: (...)属性和它的 getter 函数get len: function (){。 - 当我在 控制台 中键入
n.时,它在属性|方法列表中清晰可见。
当我为 o 变量配置相同的设置时,问题就开始了:
/********************************************************/
Object.defineProperty(
Number.prototype,'len',
{get:function(){
str=this.toString()
return str.length
}}
)
/******************************/
Object.defineProperty(
Object.prototype,'len',
{get:function(){
cnt=0
for(i in this) cnt++;
return cnt
}}
)
/********************************************************/
n=123
o={123:'abc',abc:123}
/********************************************************/
console.log(
'n ⇒ ',n,
'\n n.len ⇒ ',n.len,
'\n n.__proto__ ⇒ ',n.__proto__
)
/******************************/
console.log(
'o ⇒ ',o,
'\n o.len ⇒ ',o.len,
'\n o.__proto__ ⇒ ',o.__proto__
)
/********************************************************/
我注意到的第一件事是,当我现在在 控制台 中键入 n. 或 o. 时,属性|方法的弹出列表不再包含对 len 属性的引用,但是如果我输入完整的扩展名n.len 或o.len 我会得到3 或2 的预期结果...
所以我知道代码是合法的,但我需要 console 弹出窗口,因为 7 个基础对象中的每一个都有大约 40 种不同的属性和方法...
所以我写了一个测试块来尝试找出问题:
/********************************************************/
Object.defineProperty(
Object.prototype,'dis',
{get:function(){return this}}
)
/******************************/
Object.defineProperty(
Number.prototype,'len',
{get:function(){return this.length}}
)
/********************************************************/
o={123:'abc',abc:123}
n=123
e=document.createElement('option')
/********************************************************/
console.log(
'o ⇒ ',o,
'\n o.__proto__ ⇒ ',o.__proto__
)
/******************************/
console.log(
'n ⇒ ',n,
'\n n.__proto__ ⇒ ',n.__proto__
)
/******************************/
console.log(
'e ⇒ ',e,
'\n e.__proto__ ⇒ ',e.__proto__
)
/********************************************************/
在 控制台 中为 o、n 和现在的 e 扩展 .__proto__ 之后,我注意到所有 3 个都被赋予了我最初拥有的 dis 属性试图仅分配给 o 对象。
然后我破解了:Number.prototype 本身就是一个对象,所以它从Object.prototype 继承了dis 属性
我如何才能将dis 属性仅附加到o 对象而不被n 从Object.prototype 继承?
【问题讨论】:
-
哇。这是一个long 问题。我是否正确将其缩小到 如何将属性添加到 Object.prototype 而不将其应用于 Number.prototype?
-
所有内置构造函数原型都继承自 Object.prototype,因此添加到其中的属性出现在其他对象上也就不足为奇了。这就是长期以来修改 Object.prototype 被视为一个坏主意的原因。
-
是的,对不起@RGraham,你是对的,我只是认为一些案例历史会帮助你理解我想要实现的目标,我试图避免我已经尝试过的简单解决方案,比如下面的第一个答案...
-
@RobG:我已经知道了!事情是我只是在学习为什么它是如此真实。
标签: javascript object prototype defineproperty