js中的new关键字都干了些什么?

new 操作符

在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在javascript中,我们将这类方式成为Pseudoclassical。
基于上面的例子,我们执行如下代码

  var obj = new Base();

这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是:

new操作符具体干了什么呢?其实很简单,就干了三件事情。

var obj  = {}; obj.__proto__ = Base.prototype; Base.call(obj);

第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法,请参看陈皓《Javascript 面向对象编程文章

如果我们给Base.prototype的对象添加一些函数会有什么效果呢?
例如代码如下:

  Base.prototype.toString = function() {     return this.id; }

那么当我们使用new创建一个新对象的时候,根据__proto__的特性,toString这个方法也可以做新对象的方法被访问到。于是我们看到了:
构造子中,我们来设置‘类’的成员变量(例如:例子中的id),构造子对象prototype中我们来设置‘类’的公共方法。于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化的效果。

http://www.07net01.com/program/2016/02/1262322.html

时间: 2024-10-13 05:58:57

js中的new关键字都干了些什么?的相关文章

看看C# 6.0中那些语法糖都干了些什么(中篇)

接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想String.Format方法就是化成灰大家都认识,比如下面代码: 1 class Bird 2 { 3 private string Name = "swallow"; 4 5 public void Fly() 6 { 7 var result = string.Format(&quo

看看C# 6.0中那些语法糖都干了些什么(上篇)

今天没事,就下了个vs2015 preview,前段时间园子里面也在热炒这些新的语法糖,这里我们就来看看到底都会生成些什么样的IL? 一:自动初始化属性 确实这个比之前的版本简化了一下,不过你肯定很好奇,到底编译器给我们做了哪些东西呢? 1 class Student 2 { 3 public string Name { get; set; } = "ctrip"; 4 } 从这张图中可以看到,在ctor中<Name>k__backingfield=“ctrip“的赋值在b

看看C# 6.0中那些语法糖都干了些什么(终结篇)

终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(string[] args) 2 { 3 Dictionary<string, string> dic = new Dictionary<string, string>() 4 { 5 ["Name"] = "ctrip", 6 ["Age&qu

浅谈js中的this关键字

浅谈js中的this关键字 全局作用域中的this 函数作用域中的this 不同函数调用方法下的this 直接调用 作为对象的方法调用 作为构造函数调用 通过call或apply方法调用 嵌套函数作用域中的this 浅谈js中的this关键字 this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.接下来,笔者就从作用域的角度粗谈下自己对this关键字的理解,希望能给到大家一些启示,权当交流之用. 全局作用域中的this 本文将以作用域由

【一周读书】哲学家,你们都干了些什么?

书籍:<哲学家们都干了些什么> 在读这本书之前,我对哲学的印象是这样的: 哲学似乎和宗教有点关系?似乎在解决人的精神痛苦方面的问题?哲学就是一大堆难懂并且无用的理论!我要是和同学谈哲学肯定会被无情地嘲笑.但哲学看问题的眼光似乎很有趣?哎呀!我害怕翻哲学书! 看到了吧,我对哲学的印象就是这么混乱.直到这本书撞进我生活,作者提袋瓜子坐在我桌前,把有关哲学所有好玩的.有趣的.有用的故事.理论在几包瓜子的时间就讲清楚了. 现在就来讲讲我的收获. 作者最开始是讲宗教的发展,基督教怎样从一个小小的不出名的

swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?

date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowft 启动阶段的那些事儿 小伙伴刚接触 swoft 的时候会感觉 压力有点大, 更直观的说法是 难. 开发组是不赞成 难 这个说法的, swoft 的代码都是 php 实现的, 而 php 又是 世界上最好的语言, swoft 的代码阅读起来是很轻松的. 之后开发组会用 系列源码 解读文章, 深入解析

《哲学家们都干了些什么》——林欣浩

<哲学家们都干了些什么>--林欣浩 我们不是号称"世界上最智慧的民族"吗?为什么到处都回荡着对思考者的排斥和嘲笑呢? [是不是像尼采说得那样,弱者不想别人变强呢?还是我们对哲学的误解?我们这个民族从来不乏思考者,而哲学是智慧之书,我们有什么理由排斥呢?我们追问生命的意义,正视自己的灵魂,难道没有必要吗?难道要到了将死的那一刻才醒悟?我这一辈子看清了什么?得到又失去了什么?活了一辈子的含义在哪里?......太多问题了.我不得不去思考,不然我只是一堆物质.] 亚历山大的马其顿

loadView在App启动时到底都干了些什么?

loadView在App启动时到底都干了些什么? 查阅苹果官方文档如下: 1. 当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载nib文件或者创建一个空的view对象(self.view = nil). 2.使用nib文件创建view时,没必要重载loadView方法,因为loadView的作用就是加载nib.如果你非要重载,那么必须调用[super loadView]

关于JS中的this关键字

阮一峰大神说:它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用. this关键字虽然会根据环境变化,但是它始终指向的是调用当前函数的那个对象.在JS中调用函数的模式可以分为4种: 1.方法调用模式 当函数被保存为一个对象的属性时,它就可以称为这个对象的方法.当一个方法被调用时,this被绑定到这个对象上.如果调用表达式包含一个提取属性的动作(.或[]),那么他被称为方法调用.例如: var name="window"; var object={ name:"北落&