JavaScript对象及初识面向对象

JavaScript中的基本数据类型有number 数值类型,string 字符串类型,boolean 布尔类型,null 空类型,undefined 未定义类型,object 万能类型.在JS中我们一般创建对象都是通过var 对象名 = new Object().的语法来定义的。但是对象也分为自定义对象和内置对象。自定义对象顾名思义就是我们自己定义的对象,而内置对象例如Date,Array,String,Math,Boolean,RegExp(正则表达式)他们都有自己的静态方法。

构造函数是JS中经常使用的东西,这里构造函数和我们Java中的方法或者类,很相似。其中定义完构造函数后可以使用this关键字来特指当前函数对象。而对构造函数使用new关键字就能生成该构造函数的实例。

使用构造函数创建实例时分为四个部分,创建一个新对象,将构造函数的作用域赋给新对象,执行构造函数中的代码,返回给新对象。构造函数虽然很实用,但是也有缺点,那就是在生成实例时需要不断的使用new关键字来创建对象,这样对系统的内存占用率大,这里衍生出一个新东西,叫做原型对象。

在JS中每个构造函数都有一个prototype属性,这是一个指针,它指向了一个构造函数对象,我们可以通过prototype关键字就可以对属性进行封装,使得只有指向对象能调用里面的属性。虽然可以通过对象实例访问保存在原型中的值,但是不能通过对象实例重写原型中的值,如果原型中有个name的值实例自己也创建一个name同名值并不会改变到原型中的值,而是在自己实例里加入了这个name属性,查找机制会自动先从该实例本身找这个值,如果找到了就用本身的,如果没有就会找原型中有没有。所以实例对象是无法重写原型中的值的。

构造函数中用this和prototype定义属性或函数方法的区别:this定义的方式,实例化之后是让每一个实例化对象都有一份属于自己的在构造函数中的对象或者函数方法,而prototype定义的方式,实例化之后每个实例化对象共同拥有一份构造函数中的对象或者函数方法。一般我们使用this定义属性,因为不同对象的属性肯定是不相同的,使用原型定义方法,他们都有相同的方法,这样可以节约内存占用率。

在JS中,继承只有实现继承,没有接口继承。继承主要通过原型链完成。每个构造函数都有一个原型对象,原型对象拥有prototype属性指向函数对象,所以继承的语法为: A(子类).prototype = new B(父类)(); 这里我们可以理解为把A函数的原型对象设置成了B,这样我们就可以在A里访问到B的属性了。实际上这一步也叫重写原型对象。大概可以理解成这两个函数的原型对象已经被链接起来了。在继承中的原型搜索机制首先会在该实例的原型中找,如果没找到就会往上查找父类的原型。子类要重写父类的某个方法一定要写在继承语句完成后。不能提前写。也就是说必须在A指针指向B后才能开始重写。

原型链虽然很强大,但是也有一个问题,那就是引用类型的值会被共享,通过继承后的子类实例如果改变了父类的属性中的值,其它创建的子类会全部被改变。其次子类还不能向父类传递参数。所以,以上可以看出,如果只通过继承是达不到多态的目的,这里又出现了一个借用构造函数的方法:apply()和call(),通过这两个方法实现的继承相当于复制而并非剪贴。子类实例不会再次改变父类原型,每个实例都拥有自己的值,这里的apply()和call()的作用都是一样的,只是方法中的参数不一样,括号中有两个参数,一个是某一对象,一个是参数列表。其中apply的参数列表是一个数组,而call的参数必须手动一一列举出来,一般的语法是function B(){A.call(this)},这样就简单的实现的对A的继承,相对于原型链来说借用构造函数有个很大的优势就是可以向父类传递参数,但是也有一个弊端,那就是通过借用构造函数实现的继承不能访问父类的方法。

所以,继承大概可以这样理解,1.通过prototype指针实现的继承由于引用值类型的属性会影响到其他实例。2.通过借用构造函数实现的继承虽然不会出现数据共享的问题但是却不能访问父类的方法。

这里,我们出现了最终版本!那就是我们的组合继承,也叫伪经典继承.大致语法为:

1.function B(){A.call(this)}//继承属性

2.B.prototype = new A();//继承方法

通过以上两步我们就可以实现所有的子类实例对象访问的原型不会互相改变,并且也能使用父类的方法了。还可以向父类传递参数了,美滋滋~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值