资讯专栏INFORMATION COLUMN

js构造函数创建对象加new与不加new的问题

huashiou / 2403人阅读

摘要:今天看到这样一道题填写处的内容让下面代码支持问题操作符做了些什么呢创建一个新对象将构造函数的作用域赋给新对象因此就指向了这个新对象执行构造函数中的代码为这个新对象添加属性返回新对象。

今天看到这样一道题:
填写"TO DO"处的内容让下面代码支持a.name = "name1"; b.name = "name2";
function Obj(name){
      // TO DO
}
obj. /* TO DO  */ = "name2";
var a = Obj("name1");
var b = new Obj;
问题1:new操作符做了些什么呢?

创建一个新对象;

将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;

执行构造函数中的代码(为这个新对象添加属性) ;

返回新对象。

问题2:不加new操作符直接执行构造函数会发生什呢?
function Obj(name){
    this.name = name;
    console.log(this); // 严格模式下是undefined 非严格模式下是window对象
}

var a = Obj("name1");
console.log(a); // 结果 => undefined

哦,原来只是当作正常的函数调用来执行,Obj没有返回值,故aundefined

两者区别总结

使用new操作符创建对象,并且构造函数没有返回值或者返回为基本数据类型,那么返回该对象,如下例:

function Obj(name){
      this.name = name;
}
var b = new Obj;
console.log(b);  // Obj { name: undefined }
function Obj(name){
      this.name = name;
    return "chic";
}
var b = new Obj;
console.log(b); // 同上

如果构造函数返回一个引用类型

function Obj(name){
      this.name = name;
    return {};
}
var b = new Obj;
console.log(b); // {}
总结

对于不加new来执行构造函数来说,返回值就是构造函数的执行结果;对于加new关键字来执行构造函数而言,如果return的是基本数据类型,那么忽视掉该return值,如果返回的是一个引用类型,那么返回该引用类型。

那么问题答案你有了吗?

参考答案 :

function Obj(name){
    this.name = name;
    return this;
}
Obj.prototype.name = "name2";
var a = Obj("name1");
var b = new Obj;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92644.html

相关文章

  • 对,那是我夕阳下奔跑(刚过凌点,‘思否’第一篇文章 小白开始认真了 哈哈)

    摘要:我们将通过一个构造函数创建的对象,称为是该类的实例孙悟空男玉兔精女奔波霸男使用可以检查一个对象是否是一个类的实例语法对象构造函数如果是,则返回,否则返回所有的对象都是的后代,所以任何对象和做检查时都会返回 使用对象字面量模式来创建一个对象 (它也叫单例模式 //JS与其他语言的单例模式有很大的区别(如Java),但这就是语言的区别) var obj = {}; ...

    vpants 评论0 收藏0
  • JavaScript装逼指南

    摘要:构造函数很多教程都告诉我们,不要直接用内置对象的构造函数来创建基本变量,例如的写法就应该用的写法来取代。但是,构造函数注意是大写的有点特别。构造函数接受的参数中,第一个是要传入的参数名,第二个是函数内的代码用字符串来表示。 如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句原来还可以这样写呢?...

    oneasp 评论0 收藏0
  • 创建对象4种方式

    摘要:创建对象的种方式方式一通过对象字面量表示法又称为直接量原始方式。例子在自定义构造函数的内部定义对象的方法函数的值赋给的属性。 创建对象的4种方式 方式一:通过对象字面量表示法(又称为直接量、原始方式)。object literals 方式二:通过new和构造函数Object()、String()等。 方式三:用自定义构造函数来初始化新对象。 方式四:通过Object.create()...

    seanlook 评论0 收藏0
  • JS题目总结:原型链/new/json/MVC/Promise

    摘要:数据管理,包括数据逻辑数据请求数据存储等功能。负责处理的事件,并更新也负责监听的变化,并更新,控制其他的所有流程。上面代码就是一个最简单的类,构造函数创建出来的对象自身有属性,其原型上面有一个属性。 JS题目总结:原型链/new/json/MVC/Promise 1原型链相关 showImg(https://segmentfault.com/img/remote/14600000161...

    biaoxiaoduan 评论0 收藏0
  • JS中ArrayAPI学习笔记

    摘要:如果该函数的返回值大于,表示第一个成员排在第二个成员后面其他情况下,都是第一个元素排在第二个元素前面。第三次执行,为上一轮的返回值,为第四个成员。第四次执行,为上一轮返回值,为第五个成员。 JS中ArrayAPI学习笔记 记博客,时常回顾.尤其是面试之先回顾阮一峰标准库Array对象 1 一些标准库回顾 showImg(https://segmentfault.com/img/remo...

    tolerious 评论0 收藏0

发表评论

0条评论

huashiou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<