js中new和object.creat区别

简介: 【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。

在JavaScript中,new 关键字和 Object.create() 方法都可以用于创建对象,但它们之间存在一些重要的区别:

语法和基本使用

  • new 关键字:使用 new 关键字创建对象时,需要先定义一个构造函数,然后通过 new 操作符调用该构造函数来创建一个新的对象实例。构造函数内部使用 this 关键字来初始化对象的属性和方法。例如:
function Person(name, age) {
   
  this.name = name;
  this.age = age;
  this.sayHello = function() {
   
    console.log('Hello, I am ' + this.name);
  };
}

var person1 = new Person('Alice', 25);
person1.sayHello();
  • Object.create() 方法Object.create() 方法接受一个对象作为参数,该参数对象将作为新创建对象的原型对象。新创建的对象会继承原型对象的属性和方法。例如:
var personProto = {
   
  sayHello: function() {
   
    console.log('Hello, I am ' + this.name);
  }
};

var person2 = Object.create(personProto);
person2.name = 'Bob';
person2.sayHello();

原型链继承方式

  • new 关键字:使用 new 关键字创建对象时,新对象的原型对象是构造函数的 prototype 属性所指向的对象。通过原型链继承,子类可以继承父类原型上的属性和方法。例如:
function Parent() {
   
  this.parentProperty = 'I am from parent';
}

Parent.prototype.parentMethod = function() {
   
  console.log('This is parent method');
};

function Child() {
   
  Parent.call(this);
  this.childProperty = 'I am from child';
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child = new Child();
console.log(child.parentProperty); 
console.log(child.childProperty); 
child.parentMethod();
  • Object.create() 方法:直接将指定的对象作为新创建对象的原型,实现了一种更为直接的原型继承方式。新对象可以直接访问和调用原型对象上的属性和方法。例如:
var parentObj = {
   
  parentProperty: 'I am from parent',
  parentMethod: function() {
   
    console.log('This is parent method');
  }
};

var childObj = Object.create(parentObj);
childObj.childProperty = 'I am from child';

console.log(childObj.parentProperty); 
console.log(childObj.childProperty); 
childObj.parentMethod();

对象属性的初始化

  • new 关键字:在使用 new 关键字创建对象时,构造函数会在创建对象实例时自动执行,通过 this 关键字可以方便地初始化对象的属性。每个通过 new 创建的对象实例都有自己独立的属性值,互不干扰。
function Car(model, year) {
   
  this.model = model;
  this.year = year;
}

var car1 = new Car('Toyota', 2020);
var car2 = new Car('Honda', 2021);

console.log(car1.model); 
console.log(car2.model);
  • Object.create() 方法:使用 Object.create() 创建对象时,对象的属性需要在创建之后手动进行初始化。如果原型对象上已经有一些默认的属性值,新创建的对象会继承这些属性值,并且可以根据需要进行修改。
var carProto = {
   
  model: 'Default Model',
  year: 2000
};

var car3 = Object.create(carProto);
car3.model = 'Ford';
car3.year = 2022;

console.log(car3.model); 
console.log(car3.year);

对构造函数的依赖

  • new 关键字:依赖于构造函数来创建对象,构造函数可以定义对象的初始化逻辑、属性和方法等。通过 new 操作符,可以创建多个具有相同结构和行为的对象实例。
  • Object.create() 方法:不依赖于构造函数,直接基于一个现有的对象来创建新的对象,更加灵活,可以根据不同的原型对象创建出具有不同继承关系和行为的对象。

适用场景

  • new 关键字:适用于需要创建多个具有相同类型和结构的对象实例的场景,如创建多个具有相同属性和方法的类实例。通过构造函数可以方便地对对象进行初始化和定制,并且可以实现基于原型链的继承。
  • Object.create() 方法:适用于需要基于某个现有对象创建一个具有相似结构或继承关系的新对象的场景,特别是在不需要定义构造函数或者想要更灵活地控制对象的原型链和属性继承时非常有用。

综上所述,new 关键字和 Object.create() 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。

相关文章
|
8月前
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
229 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
6月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
157 1
|
10月前
|
设计模式
在实际开发中,什么时候应该使用 `new` 关键字,什么时候应该使用 `Object.create()` 方法?
【10月更文挑战第29天】`new` 关键字适用于创建具有特定类型和初始化逻辑的对象实例,以及实现基于原型链的继承;而 `Object.create()` 方法则适用于基于现有对象创建相似对象、避免构造函数的副作用、创建具有特定原型链的对象等场景。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象,以实现更高效、更灵活的代码结构。
|
6月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
182 1
|
6月前
|
Java
课时78:Object类的基本概念
Object类的主要特点是可以解决参数的统一问题,使用object类可以接受所有的数据类型。 1. Object类简介 2. 观察Object类接收所有子类对象 3. 使用Object类接收数组
133 0
|
9月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
116 8
|
10月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
391 4