`
JavaSam
  • 浏览: 954998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript new 关键字解密

 
阅读更多

先看张对老手不新鲜但对菜鸟很有趣的图:

    

What the heck is that? 简直是luan lun。

 

new

抛开上面的图,先看看上篇文章留下的第二个问题,让我们在构造器的函数体内加点东西,看会发生什么。

 

function A(){this.p = 1}
var a = new A()

会得到如下结果:

    

为什么用new关键字构造出来的a,会获得p这个属性?new A()这行代码做了什么事情?根据上篇文章中Function的创建过程第4步,A这个对象会有一个Construct属性(注意不是constructor,Consturct是ECMAScript标准里的属性,好像对外不可见),该属性的值是个函数,new A()即会调用A的这个Construct函数。那么这个Construct函数会做些啥呢?

  1, 创建一个object,假设叫x。

  2, 如果A.prototype是个object(一般都是),则把A.prototype赋给x.__proto__;否则(不常见),请大老板Object出马,把Object.prototype赋给x.__proto__。

  3, 调用A.call(x),第一个参数传入我们刚刚创建的x。这就妥了,A的函数体里this.p = 1,这个this,就成了x。因此x就有了p这个属性,并且x.p = 1。

  4, 一般情况下,就返回x了,这时a就是x了。但也有特殊情况,如果A的函数体里返回的东西,它的类型(typeof)是个object。那么a就不是指向x了,而是指向A函数返回的东西。

伪代码如下:

 

var x = new Object(); //事实上不一定用new来创建,我也不清楚。
x.__proto__ = A.prototype
var result = A.call(x)
if (typeof(result) == "object"){
return result;
}
return x;

 

 

 

在我们的例子里,A函数返回undefined(因为没有return字眼),所以a就是x。但我们举个例子,验证下上面第4步里的特殊情况:

    

果然。

 

对象的constructor属性

再看看上篇文章留下的第一个问题

 

function Base(){}
Base.prototype.a
= 1
var base = new Base();

function Derived(){}
Derived.prototype
= base;
var d = new Derived()

 

 

执行完上面的代码,mybase.constructor很容易猜到是Base,那么d.constructor呢?是Derived吗?

     

不对,也是Base,怎么回事?很简单,复习下上篇的内容就知道:由于d本身没有constructor属性,所以会到d.__proto__上去找,d.__proto__就是Derived.prototype,也就是base这个对象,base也没constructor属性,于是再往上,到base.__proto__上找,也就是Base.prototype。它是有constructor属性的,就是Base本身。事实上,就我目前所知,只有构造器(function类型的object)的prototype,才真正自己拥有constructor属性的对象,且“构造器.prototype.constructor === 构造器”。

 

Instanceof

那么,instanceof怎么样?

    

从图中可以看出,d是Base、Derived和Object的实例。很合理,但这是怎么判断的呢?是这样的:对于x instanceof constructor的表达式,如果constructor.prototype在x的原型(__proto__)链里,那么就返回true。很显然,d的__proto__链往上依次是:Derived.prototype, Base.prototype, Object.prototype,得到图中结果就毫无疑问了。所以,instanceof跟对象的constructor属性无关。

 

Function and Object

最后解答一下文章开头的图。

Function和Object本身也是function类型的对象,因此可以说都是Function()构造出来的东西(自己构造自己,我不知道具体是不是这样,但就这么认为,挺合理的。)

也就是说,可以设想如下代码:

 

var Function = new Function()
var Object = new Function()

 

 

根据上篇文章的规律,会有Function.__proto__ === Function.prototype,以及Object.__proto__ === Function.prototype,验证一下:

    

Function instanceof Object,这是显然为true的,万物归Object管,Function的__proto__链依次指向:Function.prototype,Object.prototype。

Object instanceof Function,因为Function.prototype在Object的__proto__链中,所以也为true。

分享到:
评论

相关推荐

    JavaScript关键字保留字属性及说明

    ### JavaScript关键字、保留字及其属性详解 #### 一、JavaScript 关键字与保留字 JavaScript是一种广泛使用的脚本语言,用于网页开发以及其他多种用途。它包含了一系列的关键字和保留字,这些词在语言中具有特殊的...

    谈谈JavaScript的New关键字

    JavaScript中的`new`关键字是创建对象实例的关键字,它在构造函数上下文中起着至关重要的作用,涉及到原型链、对象实例化以及函数调用等多个核心概念。本文将深入探讨`new`关键字的工作原理及其在JavaScript继承机制...

    javascript 常用关键字列表集合

    Javascript关键字(Reserved Words) Javascript关键字(Reserved Words)是指在Javascript语言中有特定含义,成为Javascript语法中一部分的那些字。 Javascript关键字是不能作为变量名和函数名使用的。使用Javascript...

    Javascript关键字及保留字

    在编写JavaScript代码时,我们需要遵循一定的规则,其中就包括对关键字和保留字的使用。这些关键字和保留字在JavaScript中具有特殊含义,因此不能用作函数名、变量名或其他标识符。 **JavaScript关键字** 是...

    malaxiannv#blog#JS的new关键字探寻与联想1

    那么我们用一个函数来代替new关键字,使用的时候可以这样写:var obj = mockNew(Ctor)下面就看一下如何实现这个mockNew函数实现后,我们

    不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象

    JavaScript中的对象模型(object model)并不广为人知,我们再设想:假设JavaScript没有构造函数或者没有new关键字会怎样?事情又会变成什么样的呢?让我们推到以前的重来,感兴趣的朋友可以详细了解下

    原生JS封装_new函数实现new关键字的功能

    在JavaScript中,new关键字是一个操作符,用于创建一个新的对象实例。使用new关键字时,JavaScript会进行如下操作: 1. 创建一个全新的空对象。 2. 将这个新对象的原型指向构造函数的prototype属性。 3. 将构造函数...

    javascript加密java解密

    JavaScript加密和Java解密是两种在软件开发中用于保护数据安全的技术。JavaScript通常用于前端,为用户提供了交互式体验,但因为代码可被浏览器直接查看,所以可能存在安全风险。为了保护敏感信息,开发者可能选择对...

    JavaScript_RSA加解密+分段加解密.zip

    使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,但是关于如何使用RSA完成前端的组合加密解密,东西就非常少了,并且由于RSA的特性,一...

    JavaScript加密和解密

    JavaScript加密和解密

    图解JavaScript中的this关键字

    有一种观点认为,只有正确掌握了 JavaScript 中的 this 关键字,才算是迈入了 JavaScript 这门语言的门槛。在主流的面向对象的语言中(例如Java,C#等),this 含义是明确且具体的,即指向当前对象。一般在编译期绑定...

    RSA通过javascript加密java解密

    在“RSA通过javascript加密java解密”的场景中,我们有两个主要的技术点:JavaScript端的加密和Java端的解密。以下是对这两个环节的详细说明: 1. JavaScript端的RSA加密: - 使用库:JavaScript中常见的RSA加密库...

    JavaScript关键字保留字属性及说明.doc

    JavaScript关键字保留字属性及说明.doc

    JavaScript代码加密与解密方法剖析.pdf

    JavaScript 代码加密与解密方法剖析 JavaScript 作为当前最广泛应用的脚本语言,其源代码对于整个 WEB 的安全性来说至关重要。因此,保护 JavaScript 源代码的安全性是 web 开发者和企业所关心的问题之一。本文将...

    关于javascript中this关键字(翻译+自我理解)

    首先,让我们了解JavaScript中的this关键字。在JavaScript中,this的指向不像其他一些面向对象的编程语言中那样固定,而是依赖于函数的调用方式。在传统的面向对象语言中,this关键字通常指代当前对象,但在...

    JavaScript this关键字指向常用情况解析

    JavaScript中的`this`关键字是语言中的一个核心概念,它用于引用当前执行上下文中的对象。在不同的场景下,`this`的指向会有所不同,这使得理解`this`的关键点在于理解其上下文环境。以下是对四种常见`this`指向情况...

    JavaScript 过滤关键字

    本文介绍了一个在JavaScript中过滤关键字的方法,该方法可以被用于网页中,实现对特定关键字的高亮显示。 首先,文中给出了过滤关键字的基本思路。关键步骤包括定义一个包含关键字的数组,使用正则表达式将这些...

    可以互操作的Java和Javascript RSA加密解密程序

    在“可以互操作的Java和Javascript RSA加密解密程序”中,我们看到这种技术被巧妙地应用于Java和JavaScript两个不同的编程环境中,实现跨平台的加密解密互操作。 首先,我们需要理解RSA算法的基本原理。RSA基于大数...

    javascript 加密解密软件

    JavaScript加密与解密是Web开发中的一个重要领域,主要用于保护代码安全、防止抄袭和增强应用程序的安全性。`redecoder`是一款专用于处理JavaScript(JS)文件的加密和解密工具,虽然其操作相对复杂,但其功能强大且...

Global site tag (gtag.js) - Google Analytics