创建对象
1.字面量方式
这种方式更加handy and readable
一目了然,但是不够灵活适合创建不怎么重复使用的对象,或者仅仅用来包装下代码防止scope扩大。可以简单认为是new Object()的简写形式。
js面向对象原理,循序渐进理解对象封装继承
2.用原生对象的构造函数,然后依次给属性赋值,这是最基础的方法。
js面向对象原理,循序渐进理解对象封装继承
3.利用工厂模式比如要重复制作一个某个类型的对象,但是这样每创建一个对象就会new Object()这样很不面向对象,浪费内存,不利于代码重用。最好的做法是把ownproerty实例化,但是把公用的方法,属性放到一个单独的地方(prototype原型对象),每次实例化一个对象,就把一个指针(_proto_)指向这个共有方法集合。

js面向对象原理,循序渐进理解对象封装继承

4.利用构造函数方式,因为工厂方法没有用new关键字,我们注意到原生js中总会用到new来创建对象,这样有三个好处我们以后再说。现在仅仅讲其中一个好处就是节省代码,不用在函数里面new Object()因为构造函数前面的new关键字可以自动生成临时对象,让这个临时对象接管构造函数里面的this,并且返回这个临时对象。这样我们就把构造函数里面的属性方法添加到了我们的实例person中。

js面向对象原理,循序渐进理解对象封装继承

5.因为3.中的原因,我们希望把公用的代码添加到一个特定的地方单独存放,这样就不用每次都创建一遍浪费内存,我们把公用的代码放到prototype 原型对象里面。如果把构造函数看作一个对象,原型对象是我们构造函数的一个属性,它的值是一个对象,即共有的属性方法组成的name/value pairs;
js面向对象原理,循序渐进理解对象封装继承
下面有的人就困惑了,为什么定义在构造函数的属性prototype 上的公有方法,我们也能通过m.showName调用?
这也是我初学的时候困扰我的问题,此时就涉及到new的第二个作用,将new出来的实例m的原型指针绑定到构造函数的prototype 属性上,以直接调用对象prototype 公有的方法。每个new出来的对象, 都会绑定原型到这个prototype 上。这是实现模拟php,c++,Python 类关键的一步,这样我们的构造函数就可以看做一个有public:和private:两种特性的class了!
这就是js类的实例化全部演进过程,下面我们看看它如何实现继承。
js面向对象原理,循序渐进理解对象封装继承
注意看这个Student构造函数,他做了三件事情
1.她在构造函数体内,用.call继承了Foo的私有属性,
2.把父类的原型对象复制了一份赋值给了Student 的原型对象,注意不是直接赋值,once you did so,这样他两的原型对象会指向同一个地址,是引用传值,改变父类共有方法,将会影响子类的共有方法!
3.把原型对象的constructor 指向构造函数本身,这样她才知道自己的宿主环境是谁,谁创建了它。
这三件事情就实现了继承一个类。

相关文章: