工厂模式:抽象了创建具体对象的过程

function createPerson(name, age, job){
var obj = new Object();
obj.name = name;
obj.age = age;
obj,job = job;
obj.sayName = function () {
console.log(this.name);
}
return obj;
}

根据接收参数来创建特定对象的大量副本,工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题,即怎样知道一个对象的类型.

自定义构造函数模式

这个模式可以将创建的对象标记为某个引用类型的实例,与工厂模式相比这就是优势.

构造函数没有任何区别,通过new操作符调用的函数就是构造函数

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}
}
// 这个构造函数和工厂模式区别在:没有显示地创建对象,直接将属性和方法赋给了this对象,没有return

使用new加自定义构造函数创建实例的过程:

  • 创建一个新对象
  • 将构造函数的作用域赋给新对象,因此this指针也就指向了新对象
  • 执行构造函数中的代码(为这个新对象添加属性)
  • 返回新对象

使用new加自定义构造函数创建的实例都有一个constructor(构造函数)属性,这个指针指向Person

但是如果要检测一个对象所属的引用类型还是instanceof

这种方法创建对象和下面原理一样:

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = new Funciton("console.log(this.name)");
}

用自定义构造函数的方式创建对象,会导致不同的作用域链和标识符解析,但创建Function 新实例的机制仍然是相同的。因此,不同实例上的同名函数是不相等的.

person1.sayName == person2.sayName;// false person1 和person2是Person的实例

创建两个完成同样任务的 Function 实例的确没有必要,于是可以像下面这样改进:

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
console.log(this.name);
}

这样做会带来另一个问题:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局作用域有点名不副实。如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。

js中常见的创建对象的方法(1)的更多相关文章

  1. js中常见的创建对象的方法

    前两天好好的把高程对象那一块又读了下,顺便写点笔记.补一句:代码都测试过了,应该没有问题的.可以直接拿到控制台跑! 1.工厂模式 function person(name, age, job) { v ...

  2. js 中常见的深拷贝的方法

    建议最简单的第一种 1.通过 JSON 对象实现深拷贝 this.data = JSON.parse(JSON.stringify(this.vm.$store.state.security.menu ...

  3. JS 中常见数组API使用方法(join、concat、slice、splice、reverce)

    刚接触前端不久,个人觉得学习程序还是需要经常总结的.下面是我的一些知识的归纳总结,如果哪里说得不对的还请各位大神指点! 1.to str (1)String(arr)将数组中的每个元素转为字符串并用逗 ...

  4. JS中常见的几种继承方法

    1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...

  5. js中常见的问题

    js中常见的问题 原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var ...

  6. JS中常见算法问题

    JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...

  7. js中json法创建对象(json里面的:相当于js里面的=)

    js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...

  8. JS中常见的几种报错类型

    1.SyntaxError(语法错误) 解析代码时发生的语法错误 var 1a; //Uncaught SyntaxError: Invalid or unexpected token 变量名错误 c ...

  9. 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

随机推荐

  1. final和static语句

    final关键字 final的概念 关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量.不能修饰构造方法. final的特点 当final ...

  2. 趋势投资tz-proj springcloud (vue redis)

    https://github.com/deadzq/tz-test-1 https://github.com/deadzq/tz-test-api-1 https://github.com/deadz ...

  3. CSPS_115

  4. javascript获取手机上媒体设备,摄像头和话筒

    主要运用H5的媒体接口API,MDN文档: navigator.mediaDevices(新版API),Navigator.getUserMedia(旧版API,不建议使用,但某些浏览器还支持),本文 ...

  5. Quartus RTL Simulation

    今天在做某个module的RTL Simulation时,发现之前的do文件有问题,导致信号没有导入.将sim中的XXX_tb设置成了XXX所致.改正后无误. 可参考: https://www.cnb ...

  6. xargs 命令教程

    转自阮一峰 http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html 仅供个人交流学习 xargs是 Unix 系统的一个很有用的命令,但是 ...

  7. UDF——计算壁面边界合力矩(旋转机械)

  8. Guava Cache 参数配置说明

    系统中用到了了Guava Cache: private DriverInfoServiceImpl(DriverClientProxy driverClientProxy) { this.driver ...

  9. centos如何添加ftp目录

    检查Centos服务器中是否安装了vsftpd rpm -qa |grep vsftpd 如果没有显示则没有安装 2.安装vsftpd yum -y install vsftpd 3.打开vsftpd ...

  10. 004 制作自己的Java镜像

    一:制作镜像 1.需要的知识 dockfile docker build Jpress : http://jpress.io/       开源免费的新媒体运营系统 2.下载jpress http:/ ...