我的目标是创建一个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.
输入时,属性|方法的弹出列表不再包含对该属性的引用,但是如果我输入完整的扩展名或者我得到所需的结果or ...len
n.len
o.len
3
2
所以我知道代码是合法的,但我需要控制台弹出窗口,因为 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__
)
/********************************************************/
立即在控制台中扩展.__proto__
,和nowo
后n
,e
我注意到所有 3 个都被赋予了dis
我最初尝试分配给该o
对象的属性。
然后我破解了它:Number.prototype
它本身就是一个对象,所以它继承了它的dis
属性Object.prototype
如何将dis
属性仅附加到o
对象而不被n
from继承Object.prototype
?