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 ...
随机推荐
- GDUT——1169: Krito的讨伐(优先队列BFS)
1169: Krito的讨伐 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 619 Solved: 102 Description Krito终于干 ...
- 每天php函数 - list()给一组变量赋值
array list ( mixed $varname [, mixed $... ] ) 像 array() 一样,这不是真正的函数,而是语言结构.list()用一步操作给一组变量进行赋值. var ...
- commandname+commandargument
(一) CommandName:其实可以设置成一种动作,比如Select,Update,Delete,等操作.就是说CommandName是确定他到底引发的是哪一事件,如果CommandName的名字 ...
- Oracle 数据库安装
下载 www.oracle.com ->Downloads -> Oracle Database 安装: 解压到同一文件夹下 仅安装数据库软件 单实例数据库安装 企业版 oracle基目录 ...
- Windows2008 R2修改3389端口教程
默认的3389端口有必要修改么,这个端口,我建议是修改一下为好,最好改大一点,这样安全性会高一点,但然面对高手级攻击,就没有用了,通常高手级过NMAP扫描一个你的IP地址,端便全然显现出来了,好了,下 ...
- web.xml总结整理
web.xml 配置的详细解读 web.xml (部署描述符文件) 整理参考: 加载顺序 ServletContext-->listener->filter->srvlet ...
- spm完成dmp在windows系统上导入详细过程
--查询dmp字符集 cat spmprd_20151030.dmp ','xxxx')) from dual; spm完成dmp在windows系统上导入详细过程 create tablespace ...
- 【No.3 Ionic】超级逗表情 App
本人使用Ionic框架开发了一个 超级逗表情 的App 依赖插件 cordova-plugin-app-version 0.1.9 "AppVersion" cordova-plu ...
- spring容器IOC创建对象<二>
问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...
- 利用sqlserver日志恢复数据
如果你已经急的焦头烂额,看到这篇文章的时候,请你换个坐姿,深呼吸几次,静下心来将这篇文章读完,也许你的问题迎刃而解. 我遇 到的情况是这样的,网站被植入木马,盗取了我的web.config文件,web ...