JavaScript创建对象的几种方式

谁践踏了优雅 2022-05-14 02:29 408阅读 0赞

JavaScript创建对象的几种方式

  1. 通过字面量的方式创建对象

    var obj{ name:”张学友”, job:”歌手”, sing:function(){ console.log(“大家好,我是学友!”); }
    }

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

2.通过new操作符和内置构造函数Object()

  1. var obj = new Object();
  2. obj.singer = "张学友";
  3. obj.sing = function () {
  4. console.log("一千个伤心的母牛");
  5. }
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5

以上两种方式的缺点是:代码复用性差,如果要创建多个类似的对象,会产生大量的重复代码

3.工厂模式:避免创建多个类似对象造成代码冗余

  1. function singer(name,age){
  2. var o =new Object();
  3. o.name = name;
  4. o.age = age;
  5. o.sing = function () {
  6. console.log("大家好,我是"+this.name);
  7. }
  8. return o;
  9. }
  10. var zxy = singer("张学友",20);
  11. console.log(typeof zxy);/*输出Object*/
  12. 1
  13. 2
  14. 3
  15. 4
  16. 5
  17. 6
  18. 7
  19. 8
  20. 9
  21. 10
  22. 11
  23. 12

工厂模式缺点:工厂模式解决了重复实例化的问题,但还有一个问题,无法搞清楚他们到底是哪个对象的实例。(即无法识别它是Object的实例对象还是singer的实例对象)

4.自定义构造函数的方法:

  1. function Singer(name, age) { //首字母大写以区分普通函数
  2. this.name = name;
  3. this.age = age;
  4. this.sing = function () {
  5. console.log("大家好,我是"+this.name);
  6. };
  7. }
  8. var zxy = new("张学友",20);
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5
  14. 6
  15. 7
  16. 8

构造函数的执行过程:

  1. 当使用了构造函数,并且 new 构造函数(),后台就执行了 new Object()
  2. 调用构造函数,把新创建出来的对象赋值给构造函数内的this
  3. 在构造函数内使用this为新创建出来的对象新增成员
  4. 返回新对象(后台直接返回)

构造函数式的优点:即解决了重复实例化的问题,又解决了对象识别的问题
缺点:在构造函数中定义的方法,每次创建对象时,都会重新创建该方法,造成了资源浪费

5.使用原型创建对象

  1. function Singer() { } //声明一个构造函数
  2. Singer.prototype.name = '张学友'; //在原型里添加属性
  3. Singer.prototype.age = 20;
  4. Singer.prototype.sing = function () { //在原型里添加方法
  5. console.log("大家好,我是"+this.name);
  6. };
  7. 1
  8. 2
  9. 3
  10. 4
  11. 5
  12. 6

为了封装属性和方法,并且减少不必要的代码,原型的创建可以使用字面量的方式:

  1. //使用字面量的方式
  2. function Singer() { };
  3. Singe.prototype = {
  4. constructor : Singer;//使用字面量的方式,别忘了这一步哟
  5. name : "张学友",
  6. age : 20,
  7. sing : function () {
  8. console.log("大家好,我是"+this.name);
  9. }
  10. };
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
  17. 7
  18. 8
  19. 9
  20. 10

原型方法的缺点:构造函数的原型对象中的成员,可以被该构造函数创建出来的所有对象访问,即所有的对象共享数据,还无法传参。
6.为了解决构造传参和共享问题,可以组合构造函数+ 原型模式
将不共享的属性封装在构造函数,将共享的方法封装在原型中

  1. function Singer(name, age) { //不共享的使用构造函数
  2. this.name = name;
  3. this.age = age;
  4. };
  5. Singer.prototype = { //共享的使用原型模式
  6. constructor :Singer,
  7. sing : function () {
  8. console.log("大家好,我是"+this.name);
  9. }
  10. };
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
  17. 7
  18. 8
  19. 9
  20. 10

划重点:这种混合模式解决了传参和对象共享数据的问题。但是,原型模式,不管是否调用了原型中的共享方法,它都会初始化原型中的方法。并且,明明是一个东西,写成了两部分,如果学过C#和Java,这让人感觉很怪异。于是动态原型模式闪亮登场

7.动态原型模式(完美方案)

  1. function Singer(name ,age) {
  2. this.name = name;
  3. this.age = age;
  4. if (typeof this.sing != 'function') { //仅在第一次调用的初始化
  5. Singer.prototype.sing = function () {
  6. console.log("大家好,我是"+this.name);
  7. };
  8. }
  9. }
  10. 1
  11. 2
  12. 3
  13. 4
  14. 5
  15. 6
  16. 7
  17. 8
  18. 9
  19. 10
  20. 11
  21. 12
  22. 13
  23. 14

此外还有两种用的较少的方式:

1.寄生构造函数:其实就是工厂模式+构造函数模式

  1. <p>function Singer(name, age) {
  2. var obj = new Object();
  3. obj.name = name;
  4. obj.age = age;
  5. obj.sing = function () {
  6. console.log(“大家好,我是”+this.name);
  7. };
  8. return obj;
  9. }

.2.稳妥构造函数:在一些安全的环境中使用,比如禁止使用 this 和 new(在外部实例化构造函数时不使用 new)

  1. function Singer(name , age) {
  2. var obj = new Object();
  3. obj.sing = function () {
  4. console.log("大家好,我是"+this.name);
  5. };
  6. return obj;
  7. }
  8. var zxy = Singer('张学友', 20);
  9. 1
  10. 2
  11. 3
  12. 4
  13. 5
  14. 6
  15. 7
  16. 8
  17. 9

发表评论

表情:
评论列表 (有 0 条评论,408人围观)

还没有评论,来说两句吧...

相关阅读