千家信息网

JavaScript创建对象方式有哪些

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"JavaScript创建对象方式有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JavaScript创建对象方式有哪些"吧!1
千家信息网最后更新 2026年11月01日JavaScript创建对象方式有哪些

这篇文章主要讲解了"JavaScript创建对象方式有哪些",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JavaScript创建对象方式有哪些"吧!

1. 工厂模式

function createPerson(name) {      var o = new Object();     o.name = name;     o.getName = function () {         console.log(this.name);     };      return o;  }  var person1 = createPerson('kevin');

缺点:对象无法识别,因为原型都指向Object

2. 构造函数模式

function Person(name) {      this.name = name;     this.getName = function () {         console.log(this.name);     };  }  var person1 = new Person('kevin');

优点:实例可以识别为一个特定的类型

缺点:每次创建实例每个方法都要被创建一次

2.1 构造函数模式优化

function Person(name) {      this.name = name;     this.getName = getName;  }  function getName() {     console.log(this.name); }  var person1 = new Person('kevin');

优点:解决了每个方法都要被重新创建的问题

缺点:这叫啥封装……

3. 原型模式

function Person(name) {  }  Person.prototype.name = 'keivn'; Person.prototype.getName = function () {     console.log(this.name); };  var person1 = new Person();

优点:方法不会重新创建

缺点:1. 所有的属性和方法都共享 2. 不能初始化参数

3.1 原型模式优化

function Person(name) {  }  Person.prototype = {     name: 'kevin',     getName: function () {         console.log(this.name);     } };  var person1 = new Person();

优点:封装性好了一点

缺点:重写了原型,丢失了constructor属性

3.2 原型模式优化

function Person(name) {  }  Person.prototype = {     constructor: Person,     name: 'kevin',     getName: function () {         console.log(this.name);     } };  var person1 = new Person();

优点:实例可以通过constructor属性找到所属构造函数

缺点:原型模式该有的缺点还是有

4. 组合模式

构造函数模式与原型模式双剑合璧。

function Person(name) {     this.name = name; }  Person.prototype = {     constructor: Person,     getName: function () {         console.log(this.name);     } };  var person1 = new Person();

优点:该共享的共享,该私有的私有,使用最广泛的方式

缺点:有的人就是希望全部写在一起,即更好的封装性

4.1 动态原型模式

function Person(name) {     this.name = name;     if (typeof this.getName != "function") {         Person.prototype.getName = function () {             console.log(this.name);         }     } }  var person1 = new Person();

注意:使用动态原型模式时,不能用对象字面量重写原型

解释下为什么:

function Person(name) {     this.name = name;     if (typeof this.getName != "function") {         Person.prototype = {             constructor: Person,             getName: function () {                 console.log(this.name);             }         }     } }  var person1 = new Person('kevin'); var person2 = new Person('daisy');  // 报错 并没有该方法 person1.getName();  // 注释掉上面的代码,这句是可以执行的。 person2.getName();

为了解释这个问题,假设开始执行var person1 = new Person('kevin')。

如果对new和apply的底层执行过程不是很熟悉,可以阅读底部相关链接中的文章。

我们回顾下new的实现步骤:

  1. 首先新建一个对象

  2. 然后将对象的原型指向Person.prototype

  3. 然后Person.apply(obj)

  4. 返回这个对象

注意这个时候,回顾下apply的实现步骤,会执行obj.Person方法,这个时候就会执行if语句内的内容,注意构造函数的prototype属性指向了实例的原型,使用字面量方式直接覆盖Person.prototype,并不会更改实例的原型的值,person1依然是指向了以前的原型,而不是Person.prototype。而之前的原型是没有getName方法的,所以就报错了!

如果你就是想用字面量方式写代码,可以尝试下这种:

function Person(name) {     this.name = name;     if (typeof this.getName != "function") {         Person.prototype = {             constructor: Person,             getName: function () {                 console.log(this.name);             }         }          return new Person(name);     } }  var person1 = new Person('kevin'); var person2 = new Person('daisy');  person1.getName(); // kevin person2.getName();  // daisy

5.1 寄生构造函数模式

function Person(name) {      var o = new Object();     o.name = name;     o.getName = function () {         console.log(this.name);     };      return o;  }  var person1 = new Person('kevin'); console.log(person1 instanceof Person) // false console.log(person1 instanceof Object)  // true

寄生构造函数模式,我个人认为应该这样读: 寄生-构造函数-模式,也就是说寄生在构造函数的一种方法。

也就是说打着构造函数的幌子挂羊头卖狗肉,你看创建的实例使用instanceof都无法指向构造函数!

这样方法可以在特殊情况下使用。比如我们想创建一个具有额外方法的特殊数组,但是又不想直接修改Array构造函数,我们可以这样写:

function SpecialArray() {     var values = new Array();      for (var i = 0, len = arguments.length; i < len; i++) {         values.push(arguments[i]);     }      values.toPipedString = function () {         return this.join("|");     };     return values; }  var colors = new SpecialArray('red', 'blue', 'green'); var colors2 = SpecialArray('red2', 'blue2', 'green2');   console.log(colors); console.log(colors.toPipedString()); // red|blue|green  console.log(colors2); console.log(colors2.toPipedString()); // red2|blue2|green2

你会发现,其实所谓的寄生构造函数模式就是比工厂模式在创建对象的时候,多使用了一个new,实际上两者的结果是一样的。

但是作者可能是希望能像使用普通Array一样使用SpecialArray,虽然把specialarray当成函数也一样能用,但是这并不是作者的本意,也变得不优雅。

在可以使用其他模式的情况下,不要使用这种模式。

但是值得一提的是,上面例子中的循环:

for (var i = 0, len = arguments.length; i < len; i++) {        values.push(arguments[i]);    }

可以替换成:

values.push.apply(values, arguments);

5.2 稳妥构造函数模式

function person(name){     var o = new Object();     o.getName = function(){         console.log(name);     };     return o; }  var person1 = person('kevin');  person1.sayName(); // kevin  person1.name = "daisy";  person1.sayName(); // kevin  console.log(person1.name); // daisy

所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this的对象。

与寄生构造函数模式有两点不同:

  • 新创建的实例方法不引用this

  • 不使用new操作符调用构造函数

稳妥对象最适合在一些安全的环境中。

稳妥构造函数模式也跟工厂模式一样,无法识别对象所属类型。

感谢各位的阅读,以上就是"JavaScript创建对象方式有哪些"的内容了,经过本文的学习后,相信大家对JavaScript创建对象方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

模式 函数 原型 对象 方法 缺点 方式 实例 优点 寄生 属性 指向 稳妥 就是 内容 字面 工厂 情况 时候 问题 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技活动banner 互联网公司 科技公司 善班互联网科技 奔汉互联网科技 互联网科技宣传片 一五八零互联网科技 华中科技有哪些互联网大佬 科技赋能互联网健康 湖北码尼互联网科技有限公司电话 杭州壁岐互联网科技有限公司 中国科技创新与世界互联网大会 互联网公司黑科技创始人 济南有互联网科技公司吗 伊宁互联网科技做什么的 科技互联网行业投资研究 陕西九四连强互联网科技有限公司 广州智享互联网科技 银川新华互联网科技学校是国营吗 盐城市攀科互联网科技有限公司 互联网的黑科技实验室 互联网科技公司经营范围 科技创新与互联网经济 互联网和科技创新 现代科技和互联网有关系吗 互联网经济与金融科技 玉溪新华互联网科技好不好 银行科技岗属于互联网吗 广州百诚互联网科技有限公司官网 福州德业互联网科技 互联网科技创业有什么好项目
0