js之面向对象编程

2025-05-17 10:12:20

1、JS对象与其它对象的区别:像JAVA与C++语言中的对象,是先构造一个类,再通过类实例化对一个对象而javascript却不一样:JavaScript中不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程。

js之面向对象编程

2、什献垴淄睬么是JS中的原型(prototype):首先来与电影类比一下:有一个人的生活很精彩,所以可以把他的一生搬上大荧幕,我们就叫以这个人为原型,制作成的电影。由于JS没有【类】这个概念,所以我们要得到一个对象时,可以找一个类似的对象为原型,通过属性的修改来得到新的对象。代码示例如下:假设想生成一个名叫【小明】的对象,但我之前有一个叫【小红】的对象,我就可以以【小红】对象为原型,来生成【小明】。// 定义小红var xh ={ name: 'xiaohong', height: 1.2, run: function () { console.log(this.name + ' is running...'); }};// 定义小明var xm = { name: '小明'};// 把小明的原型设定为小红,这时除了在小明对象中重新定义过的name属性// 其它属于和方法都会继承小红的内容。xm.__proto__ = xh ;// 如果有一天【小明】想飞了,那可以把他的原型设定不一只鸟:var Bird ={ fly: function () { console.log(this.name + ' is flying...'); }};xiaoming.__proto__ = Bird;注意:JavaScript没有“Class”的概念,它是用原型这个概念来实现面向对象的封装,继承和多态的。

js之面向对象编程

3、用create()方法创建对象:不要直接用obj.__proto__去改变一个对象的原型,不符合面向对象的啥高友岛思想,有些浏览器也不支持。用create()方法的代码示例如下:// 原型对象var Student = { name: 'nobody', height: 1.6, run: function () { console.log(this.name + ' is running...'); }};function createStudent(name) { // 以Student为原型创建一个新对象: var stu = Object.create(Student); // 初始化新对象: stu.name = name; return stu;}// 创建名叫小明的对象var xiaoming = createStudent('小明');xiaoming.run();// xiaoming.__proto__ === Student;xiaoming对象的原型就是Student。

js之面向对象编程

4、原型链说明:原型是可以不断系继承的,如上例中小明的原型是学生,那学生的原型还可以是人,如下:xiaoming.__proto__ === StudentStudent.__proto__=== Person在查找一个属性时,如果当前对象有,就直接返回,如当前对象没有,就在上一级原型中去查找。到最终一级原型上都没找到的话,就只能返回undefined了。如数据的原型链如下:var arr = [1, 2];其原型链是:arr ----> Array.prototype ----> Object.prototype ----> null函数的原型链是:function foo() { return 0; }foo ----> Function.prototype ----> Object.prototype ----> null

js之面向对象编程

5、JS中的构造函数:以下是一个普通函数,它返回undefined:function Student(name) { this.name = name; this.hello = function () { alert('Hello, ' + this.name + '!'); }}// 如果以new关键字来调用,Student就变成了一个构造函数,它绑定的this指向新创建的对象,并默认返回this,也就是说,不需要在最后写return this;var xiaoming = new Student('小明');新创建的xiaoming的原型链是:xiaoming ----> Student.prototype ----> Object.prototype ----> null

js之面向对象编程

6、内存浪费的问题:以上function Student(name) 函数为例:var s1 = new Student('小明');var s2 = new Student('小红');var s3 = new Student('小天');其中s1,s2,s3都包含不同的name与hello属性。有不同name是合理的,因为大家的名字都不相同。但不同的hello却不合理了,因为s1,s2,s3中hello的代码与功能都是相同的,所以只应该存在一份就行了。这时就需要把hello从Student中移动到Student的原型中。原因如下:当s1,s2,s3不存在在hello属性时,就会自动去搜索它所在的原型是否提供了该属性。这样一来就只需要一个hello代码就行了,内存也就不会造成浪费了。

js之面向对象编程

7、不要忘记写new:如果生成对象时忘记写new了,如下:var xiaoming = Student('小明');在strict模式下,this.name = name将报错,因为this绑定为undefined。在非strict模式下,this.name = name不报错,因为this绑定为window,于是无意间创建了全局变量name,并且返回undefined。所以生成对象时千万不要忘记了写new。

js之面向对象编程
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢