JavaScript之对象实例的创建和继承
来源:互联网 发布:psd数据库 编辑:程序博客网 时间:2024/06/05 10:22
之前着重说过JavaScript的原型链继承方式,以及通过apply或者call函数实现“继承”的方式,不过,要彻底理解继承,需要弄清楚JavaScript的对象实例是如何创建的
Douglas Crockford说过:JavaScript除了underfined和null,其他都是对象,其实用typeof测了一下,发现null也是对象(据说这是JavaScript语言设计的错误)
另外,Object对象是根对象,其余的function,number,string以及array等,都是通过原型链的方式继承于object对象,所以,几乎一切皆对象
但程序中我们不会关心对象的创立过程,而会关心对象实例的创建过程
一. 定义
1.直接创建对象实例
var x = {value : "Hi!",print : function() {console.log(this.value);}}console.log(x.value); //Hi!x.print(); //Hi!
不过,这里似乎少了什么东西,对,C类语言中的private,protected,public去哪里了,其实这些东西JavaScript并没有显示的支持,所以通过这种方式创建的对象实例,属性和方法都是public的,如果要实现private之类的,只能借助于闭包或其他方法了
2.通过new方法创建function对象实例
凡是function对象,JavaScript都提供了new方法来创建对象实例(当然,对于基本对象string,number,boolean等,JavaScript和java相似都提供了包装器对象,所以也可以通过new方法来创建,不过并不推荐使用,最好通过字面量方式直接赋值)
var x = new String("Hi!");var y = "Hi!"; //推荐使用
var x = function() {this.value = "Hi!";this.print = function() {console.log(this.value);}}console.log((new x()).value); //Hi!(new x()).print(); //Hi!
这种方法就很像java,php之类的创建对象实例的方式,这种方式就是构造函数方式,不过这里的属性和方法要通过this对象指定才能在外面被引用,var声明的属性或者直接声明的方法都是private的
var x = function() {var value = "Hi!";function print() {console.log(this.value);}}console.log((new x()).value); //underfined(new x()).print(); //报错
之所以会出现这种情况,是因为JavaScript作用域以及this对象的关系
3.通过Object对象提供的方法
这种方法既是一个创建对象实例的方法,同时也是一个继承的方法
- 形式
Object.create(prototype, descriptors)
- 参数
prototype 必需,要用作原型的对象,可以为 null
descriptors 可选, 包含一个或多个属性描述符的 JavaScript 对象
- 返回值
一个具有指定的内部原型且包含指定的属性(如果有)的新对象
- 定义
创建一个具有指定原型且可选择性地包含指定属性的对象
create方法有两个参数,这里暂时忽略descriptors参数,只考虑第一个参数,第一个参数传进去的是对象实例
var x = {value : "Hi!",print : function() {console.log(this.value);}}var y = Object.create(x);console.log(y.value); //Hi!y.print(); //Hi!
这里创建了一个新的对象实例y,并且继承了x对象实例的属性和方法
Object.create = function(o) {var F = function() {};F.prototype = o;return new F();};所以还是原型链的继承方式,只是封装了一层而已,让我们的操作更加简化了
二.使用
1.new方法的使用
之前说过,new方法其实不被推荐使用,其中有一点就是因为这种方法很可能会出错,首先是函数有返回对象实例的时候,new方法创建的就是这个对象实例:
var x = function() {this.num = 3;return {value : "Hi!"}}console.log((new x()).num); //underfinedconsole.log((new x()).value); //Hi!不过当函数返回基本对象(number,string)的时候,new方法却不受返回值的影响(tips:这里不考虑包装器对象,其实如果返回包装器对象new方法要受影响)
var x = function() {this.num = 3;return "Hi!";}console.log((new x()).num); //3因此使用new方法时是要格外注意是否该函数有返回对象实例
2.一些后记
这里介绍了三种创建对象实例的方式,这三种方式是JavaScript语言本身提供的,实现起来也很简单,我们可以根据自己的需要任意选择
另外,关于继承,之前讲过原型链的继承方式,这里Object提供了一种封装,可以简化我们的一些操作,还有之前说的apply和call方式只是一种应用技巧,也算是“继承”吧,虽然原理上只是浅拷贝
另外还要说明一点就是JavaScript的赋值其实复制的是对象实例的引用,这一点和java很像:
var x = {value : "Hi"}var y = x;y.value = "Hello!";console.log(x.value); //Hello!这一点一定要注意(不过java的基本类型是不会复制引用的,JavaScript也是如此,number和string赋值不会复制引用)
- JavaScript之对象实例的创建和继承
- JavaScript对象的创建和继承实现
- javascript对象的创建和继承实现
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- Java程序员从笨鸟到菜鸟之(二十九)javascript对象的创建和继承实现
- 35.JavaScript的对象的创建和继承
- JavaScript的中对象创建和继承原理
- 谈谈JavaScript里对象的创建和继承(一)
- JavaScript学习——对象的创建和继承
- JavaScript中怎样创建对象和继承
- Javascript之对象的继承
- JavaScript的对象和继承
- 面向对象的Javascript,创建静态方法和实例方法
- JavaScript面向对象之Prototypes和继承
- javascript类的创建与实例对象
- javascript 类的继承和实例化
- 字符串数字从小到大输出
- 新博客的第一篇
- 用calibre抓取乌云知识库并生成电子书
- 电脑远程软件TeamViewer
- ActionBar 浮动,毛玻璃渐变效果(仿蝉游记)
- JavaScript之对象实例的创建和继承
- linux 内存清理释放命令
- grails插件【Asset-Pipeline】
- 浅析单例模式与线程安全(Linux环境c++版本)
- HDU1054(最小顶点覆盖)解题报告
- Java4Android学习十五 - 类集框架
- UVA 10341 Solve It(二分)
- listview的缓存机制
- 图片内存溢出处理