前言
首先,要说明的我是一个计算机爱好者,但我并不是科班出身,也没有受过专业的培训,所以,有些专业名词可能用的不当或者看法偏激乃至错误,敬请谅解并给予斧正为盼。
一、Object是什么?
刚开始我简单地认为Object是js的所有对象的原型(基类)。但我在作测试时发现如下怪现象:
alert(Object.prototype.constructor)
这条语句显示function Object(){[native code]}。我们知道一个对象的constructor的返回值是创建这个对象的类的构造体,因此根据以上代码的结果,说明Object的原型是Function。这一点可以从下面的两行下面代码得到进一步验证:
Function.prototype.read=function(){};//扩展Function的原型
for(var i in Object)alert(i) //显示read,这进一步证实了Object的原型是Function
/*但问题不这么简单,请看下面两行代码:*/
Object.prototype.read=function(){};//扩展Object的原型
for(var i in Function)alert(i)//显示read,Function的原型是Object????
对于Object与Function互相继承对方的prototype属性集,我百思不得其解,就将这四行代码提交给了birdshome,请他解疑。尽管还是没有解决疑问,我还是非常感谢他的回答――给了我极大的鼓励!后来看到网友supersnake 关于这个问题的回复评论,结合前段时间的思考,算是初步理解了一点。现在把我的这点理解写出来,供大家参考:
1、要想准确理解JS的Object,必须认识到一点:Object首先是一个"概念"、是一个高度抽象的"概念",它并不具有太多的操作意义,但正是由于它的高度抽象性,我们才有必要深入地研究它,只有这样,才能深入地理解JS。
进一步讲,Object是对JS中所有复合数据类型的高度抽象,代表了JS中具有相应构造体、相对清晰的结构和具有可执行意义的集合体!因此:Function、Array、Date、Number、Boolean、String、Error和RegExp等是object,Object自身是object,自定义类是object,window是object,document是object,Dom对象是object,{}是object......
总之,JS中的一切复合数据类型都是object,都以Object为原型。因此对Object原型的扩充,Function当然继承,就连Object自身也同样继承:试看下例:
Object.prototype.read=function(){};//扩展Object的原型
for(var i in Object)alert(i)//显示read
2、Object既然是JS中的一切复合数据类型的原型,那么它就是一个类,一个基类。在JS中,类都以Function为原型。看下面的例子:
var _test=[Number,Array,Date,Boolean,Error, RegExp,Object];
for(var i=0;i<_test.length;i++)
{
document.writeln(_test[i].prototype.constructor);
document.write("
")
}
我们的得的结果是:
function Number() { [native code] }
function Array() { [native code] }
function Date() { [native code] }
function Boolean() { [native code] }
function Error() { [native code] }
function RegExp() { [native code] }
function Object() { [native code] }
可见JS中的内部类都是Function的子类。因此对Function原型的扩充必然会被Object继承!
总结语:做为概念的Object和做为类的Object是不同的,前者的外延包含了后者的外延,理解了这一点,就能熟练掌握JS的Object类了。
二、做为概念的Object的分类:
1、做为类的Object,如上所述。包括非Build-in Object的Native Object(注)、自定义类等。
2、做为静态name-value对集合的Object(可能这才是Object的真谛),如
var _collection={
length : 1,
item : ["first"],
insert : function(){}
}
它不能被继承、没有prototype子集;不能被实例化,因此它是静态的;它具有集合的演算特征:析取操作符[],删除成员操作符:delete.......
3、各种类的实例对象,如
myArray也是Object类型。
4、Build-in对象。
5、依赖于宿主环境的Object:DOM、window。对Object原型的扩充不能被"依赖于宿主环境的Object"所继承(注,在mozilla中,会继承名字,但无法执行)。
三、Object的属性和方法
1、Object.length :Object构造体的形参数量。Object的构造体有一个可选的参数 ‘value',因此 Object.length= 1,但IE不报告可选参数,所以在IE下,此属性值为0。
2、Object.name :Mozilla支持,返回"Object"。
3、Object.prototype
4、Object.prototype.constructor
5、Object.prototype.eval(source) :eval is supported in Mozilla but not MSIE。
6、Object.prototype.hasOwnProperty(property) :returns true if property is a local (unshared) property of the instance。
7、Object.prototype.isEnumerable(property) :returns true if property is enumerated during a for (p in instance) loop,Mozilla and MSIE do not support isEnumerable。
8、Object.prototype.isPrototypeOf(object) :returns true if the instance is the prototype of object。
9、Object.prototype.toLocaleString() :returns a localized string representing the instance
10、Object.prototype.toString()
11、Object.prototype.valueOf()
12、object.__proto__ :Mozilla支持, points to its prototype object。
另外,还具有[]、instanceof 和 delete等运算符
注:
Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global、Math;一些是在脚本运行环境中创建来使用的,如:Array、Boolean、Date、Function、Number、Object、RegExp、Error。
Build-in Object: JavaScript语言自身的内建对象,如:Global、Math;
Host Object:宿主环境对象,如:IE中的window、DOM对象等。
四、下一步的思考
1、建立继承机制。一般的做法是对Function的原型进行扩充(即在Function的prototype属性集内新建继承函数),但是对Function原型的扩充会被做为类的Object自动继承,也就是说,当javascript引擎初始化自定义类时,会自动去执行一遍扩充的继承函数,并将该函数赋予自定义类,这样效率高吗?
JS的特征首先是灵活,不是所有的地方都需要继承机制,因此建立一个具有继承函数的Class基类,需要继承机制的就引用这个Class,不需要的就不引用,这样的话效率可能会更高......
2、Object的集合特性
function person()
{
this.name;
this.age;
this.setAge=function(_age){this.age=_age;};
}//建立person自定义类
person.eat=function(){};
person.language=["han","english"];
alert(person["eat"]);//显示function(){}
alert(person["language"]); //显示han,english
这个person难道不是一个集合吗?
分享到:
相关推荐
本教程旨在为初学者和中级开发者提供一个全面的Object-C编程学习路径,从基础语法入手,逐步深入到高级编程技巧,并通过实际案例和项目练习,帮助学习者掌握Object-C在iOS和OS X开发中的应用。无论你是想开发iOS应用...
applet 调用js 所需包 JSObject.getWindow(this).eval("javascript:alert(111)");
javascript 高级 对象 object js
对象克隆ES5的深克隆和比较概要// just for conveniencevar log = function ( ) { console . log . apply ( console , [ ] . slice . call ( arguments ) ) } ; var src = { name : '... push ( 'javascript' ) ;log
Build sophisticated web applications by mastering the art of Object-Oriented Javascript About This Book Learn popular Object-Oriented programming (OOP) principles and design patterns to build robust ...
script href =" path/to/js-object-format.js " > </ script >< script >var resultHtml = jsObjectFormat . format ( objectToFormat , options ) ;</ script >选项首选类型: String默认值...
This brief book explains the advantages of the object model, inheritance, both classical and prototypical, and shows how these concepts can be implemented in JavaScript. It also shows how object ...
salient object detection: a discriminative regional feature intergration approach---CVPR2013上一篇关于判别式局部特征融合的显著性检测方法
object.pick 返回的对象的过滤拷贝仅与指定的键,类似于_.pick从lodash /下划线。... node.js / javascript util。 | :使用属性路径( abc )从对象获取嵌套值。 | 主页 mixin-deep :将对象的属性
上传头像的时候遇到了头像变形的问题,最后通过object-fit: cover完美解决了。这个CSS属性可以达到最佳最完美的居中自动剪裁图片的功能。 object-fit 理解 CSS3 background-size出现的比较早,大家应该知道其支持的...
Data::Object::Universal - Perl 5 的通用对象 版本 版本 0.02 地位 概要 use Data::Object::Universal; my $object = Data::Object::Universal->new($scalar); 描述 Data::Object::Universal 提供了操作任何 Perl ...
JS.Object-PracticeQuesions:这些是解决的Javascript实践问题
Object Oriented JavaScript, 3rd Edition Learn everything you need to know about object-oriented JavaScript with this comprehensive guide. Enter the world of cutting-edge development! About This Book ...
Introduction to JavaScript Object Notation - Early Release
css 到 js 对象 实验性:将 css 转换为 JS 对象。 灵感来自: : 。 安装 npm install css-to-js-object 例子 从: . modal { border-style : dotted; } . header { color : yellow; } . body { background : ...
对象映射器使对象到对象的转换变得容易。快速示例 const sourceObject = { fabfour : { user_count : 4 } , user : [ { first : 'John' , last : 'Lennon' , instruments : [ { name : 'Guitar' , colour : 'Red' } ...
从 json 对象中选择并提取路径 安装 这个包在上可用: select-object-path $ npm install select-object-path 用法 函数sop.select参数必须sop.select json-schema 。 var sop = require ( 'select-object-path' ...