new操作符做了什么??
在javascript中,new操作符随处可见,我讲一下我自己对new操作符的理解。。。
构造函数无返回值
//测试代码
function Foo(name) {
var age = 20;
this.name = name;
} Foo.prototype.getName = function() {
return this.name;
} var foo = new Foo("Jack"); console.log(foo.age); //undefined
console.log(foo.name); //Jack
console.log(foo.getName()); //Jack
new的具体过程(借用大神的代码):
function internalConstructor(parameters ) {
O = new Object(); //new一个空对象
O.[[Class]] = "Object"; //类型是Object
//如果F.prototype是Object,O.[[Ptototype]](也就是O.__proto__)为F.prototype,否则为Object.prototype
O.[[Prototype]] = Type(F. prototype) === 'Object' ?
F.prototype : Object.prototype;
//在对象O的作用域下,执行F.[[call]] 函数,能够复制构造函数的this属性到实例对象
R = F.[[Call]].apply(O, parameters);
//如果R是Object,则返回R,否则返回O,也就是说构造函数存在this相关属性,则返回R,无this相关属性,直接返回O
return Type(R) === 'Object' ? R : O;
}
构造函数存在返回值
1、如果返回(return)一个原始类型(无 return 时其实为return原始类型undefined),那么就返回new创建的匿名对象
//测试代码
function Foo(name) {
var age = 20;
this.name = name;
return 1;
} Foo.prototype.getName = function() {
return this.name;
} var foo = new Foo("Jack"); console.log(foo.age); //undefined
console.log(foo.name); //Jack
console.log(foo.getName()); //Jack
2、只要new表达式之后的构造函数返回(return)一个引用对象(数组,对象,函数等),都将覆盖new创建的匿名对象
//测试代码
function Foo(name) {
var age = 20;
this.name = name;
return {};
} Foo.prototype.getName = function() {
return this.name;
} var foo = new Foo("Jack"); console.log(foo); //Object {}
console.log(foo.age); //undefined
console.log(foo.name); //undefined
console.log(foo.getName()); //Uncaught TypeError: foo.getName is not a function
正常的构造函数是没有返回值的,如果有返回值的话,直接执行构造函数获得返回值就行,也就没必要new了。。。。。。。
new操作符做了什么??的更多相关文章
- new 操作符 做了什么
new 操作符 做了什么 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 假设Test是一个构造函数,通常在创建对象的实例时,要使用new,eg:test = new ...
- JavaScript下的new操作符做了什么?
可以参考知乎的一篇文章:https://zhuanlan.zhihu.com/p/23987456 参考网上其他人的文章,new发生了以下操作 参考MDN:https://developer.mozi ...
- C#的new操作符到底做了什么
使用new操作符来创建对象,其背后到底发生了什么? 有一个父类Animal,Dog派生于Animal. class Program { static void Main(string[] args) ...
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
一.new关键字 CLR要求所有的对象都通过new来创建,代码如下: Object obj=new Object(); 以下是new操作符做的事情 1.计算类型及其所有基类型(一直到System.Ob ...
- C++ 中 new 操作符内幕:new operator、operator new、placement new
一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...
- [c++基础]3/5原则--拷贝构造函数+拷贝赋值操作符
/* * main.cpp * * Created on: Apr 7, 2016 * Author: lizhen */ #include <iostream> #include &qu ...
- LiveScript 操作符
The LiveScript Book The LiveScript Book 操作符 数字 标准的数学操作符: 1.1 + 2 # => 32.3 - 4 # => -13.6 ...
- 实现一个new操作符
new 操作符做了这些事: 1.它创建了一个全新的对象: 2.它会被执行[[Prototype]](也就是__proto__)链接: 3.它使this指向新创建的对象: 4.通过new创建的每个对象最 ...
- js中的new操作符解析
new 操作符做了以下事情: 1.创建一个对象,将对象赋值给this function Person(name, age) { console.log(this) //Person {} } let ...
随机推荐
- 使用HIBERNATE的SQL查询并将结果集自动转换成POJO
在某些场合下,我们可能想使用HIBERNATE的框架提供的SQL查询接口,但是,由于实体没有做映射,HIBERNATE不能把结果集转换成你想要的List<POJO>,本文讨论如何在这种情况 ...
- 一些站点使用的服务器软件、js 框架大收集 [ 整理中 ]
Chrome 的扩展应用 ChromeSnifferPlus ( 开源中国地址:http://www.oschina.net/p/chromesnifferplus,GitHub 地址:https:/ ...
- Unix时间戳(Unix timestamp)转换工具
http://tool.chinaz.com/Tools/unixtime.aspx 现在的Unix时间戳(Unix timestamp)是 1440732364 Unix时间戳( ...
- 使用 PHP 限制下载速度
使用 PHP 限制下载速度 [来源] 达内 [编辑] 达内 [时间]2012-12-12 经常遇到一个问题,那就是有人再办公室下载东西,影响大家上网.办公.同样的问题,要是出现在了服务器上面 ...
- ExtJS笔记2 Class System
For the first time in its history, Ext JS went through a huge refactoring from the ground up with th ...
- Bootstrap页面布局4 - 嵌套布局
嵌套布局: 在一行中,有三列,每一列都有对应的BS栅格系统中的格子,以下例中因为 .row中的div对应的class分别是span4,span4,span4,所以其每一列对应的格子数是 4,4,4 现 ...
- Listener-监听器+ServletContext+ApplicationContext
参考资料 ServletContext和ApplicationContext有什么区别 ServletContext:是web容器的东西, 一个webapp一个, 比session作用范围要大, 从中 ...
- for循环经典案例
1.棋盘放粮食棋盘有32个格子,第一个格子放1个芝麻,第二个放2个,第三个放4个,第四个放8个...每个芝麻的重量为0.00001kg,如果要放满整个棋盘,需要多少重量的芝麻. <!DOCTYP ...
- java effective 读书笔记
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...
- $_SERVER存储
$_SERVER["QUERY_STRING"], $_SERVER["REQUEST_URI"], $_SERVER["SCRIPT_NAME&qu ...