• 关于

    函数也是对象

    的搜索结果

回答

构造方法作用:对对象进行初始化.(1). 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。(2). 构造函数是在对象建立时由jvm调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。(3). 普通函数可以使用对象多次调用,构造函数就在创建对象时调用。(4). 构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。(5). 构造函数没有返回值类型。

君浩 2019-12-02 01:03:48 0 浏览量 回答数 0

回答

在python中,一切皆为对象,函数也是对象,我们定义的名称只是绑定到这些对象的标识符。 函数也不例外,它们也是对象(带有属性)。 各种不同的名称可以绑定到同一个功能对象。python 中的函数参数可以是函数(因为都是对象嘛),如果你曾经用过map,filter等方法,那么你一定会对此有所了解。修饰器的作用就是动态的为旧函数增加新的语句,把旧函数“装饰”一番。 希望我的答案能够帮助到你,答案满意还请采纳,谢谢。

大财主 2019-12-02 01:06:30 0 浏览量 回答数 0

回答

我们一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大量相似对象的时候,会产生大量的重复代码。但 js 和一般的面向对象的语言不同,在 ES6 之前它没有类的概念。但是我们可以使用函数来进行模拟,从而产生出可复用的对象 创建方式,我了解到的方式有这么几种: (1)第一种是工厂模式,工厂模式的主要工作原理是用函数来封装创建对象的细节,从而通过调用函数来达到复用的目的。但是它有一个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是简单的封装了复用代码,而没有建立起对象和类型间的关系。 (2)第二种是构造函数模式。js 中每一个函数都可以作为构造函数,只要一个函数是通过 new 来调用的,那么我们就可以把它称为构造函数。执行构造函数首先会创建一个对象,然后将对象的原型指向构造函数的 prototype 属性,然后将执行上下文中的 this 指向这个对象,最后再执行整个函数,如果返回值不是对象,则返回新建的对象。因为 this 的值指向了新建的对象,因此我们可以使用 this 给对象赋值。构造函数模式相对于工厂模式的优点是,所创建的对象和构造函数建立起了联系,因此我们可以通过原型来识别对象的类型。但是构造函数存在一个缺点就是,造成了不必要的函数对象的创建,因为在 js 中函数也是一个对象,因此如果对象属性中如果包含函数的话,那么每次我们都会新建一个函数对象,浪费了不必要的内存空间,因为函数是所有的实例都可以通用的。 (3)第三种模式是原型模式,因为每一个函数都有一个 prototype 属性,这个属性是一个对象,它包含了通过构造函数创建的所有实例都能共享的属性和方法。因此我们可以使用原型对象来添加公用属性和方法,从而实现代码的复用。这种方式相对于构造函数模式来说,解决了函数对象的复用问题。但是这种模式也存在一些问题,一个是没有办法通过传入参数来初始化值,另一个是如果存在一个引用类型如 Array 这样的值,那么所有的实例将共享一个对象,一个实例对引用类型值的改变会影响所有的实例。 (4)第四种模式是组合使用构造函数模式和原型模式,这是创建自定义类型的最常见方式。因为构造函数模式和原型模式分开使用都存在一些问题,因此我们可以组合使用这两种模式,通过构造函数来初始化对象的属性,通过原型对象来实现函数方法的复用。这种方法很好的解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使用了两种不同的模式,所以对于代码的封装性不够好。 (5)第五种模式是动态原型模式,这一种模式将原型方法赋值的创建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以实现仅在第一次调用函数时对原型对象赋值一次的效果。这一种方式很好地对上面的混合模式进行了封装。 (6)第六种模式是寄生构造函数模式,这一种模式和工厂模式的实现基本相同,我对这个模式的理解是,它主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。它的一个缺点和工厂模式一样,无法实现对象的识别。 嗯我目前了解到的就是这么几种方式。

剑曼红尘 2020-04-03 15:14:03 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

一句话告诉你如何区分函数与方法:函数是大家的函数,方法是类的方法。如何区分一个ITer是设计师还是码工。看看他是在调别人的库,还是自己写出JAR包跟别人分享。感觉差的不是一个级别而已啊。一个东西,用对象调用的叫方法,直接调函数名的叫函数。c语言等语言里叫函数,面向对象编程,函数写到类里边就叫做方法,函数可以直接调用,对象中的方法一般都有指针this指向它,但是有时一些方法实在不需要写到类里边,所以面向对象的语言有了静态方法,不过这个概念没必要纠结,用的多了自然就明白啦函数Function, 过程Procedure, 方法Method,你可以简单把他们当成同一个概念:都是由若干语句组成的一个可执行代码体。函数:Function(面向过程语言教程的英文原版,是否有一个把Function翻译为Method的?)方法:Method(只有不地道的面向对象语言教程才会把Method叫做Function)意思一样的,可能就是方法偏重于类,也就是面向对象设计的,注重每个函数的功能所以叫方法;而函数偏重于面向过程,有可能是功能描述也有能不是,两者都有是看编程者自己怎么看的

蛮大人123 2019-12-02 02:19:47 0 浏览量 回答数 0

回答

this 是执行上下文中的一个属性,它指向最后一次调用这个方法的对象。在实际开发中,this 的指向可以通过四种调用模 式来判断。 1.第一种是函数调用模式,当一个函数不是一个对象的属性时,直接作为函数来调用时,this 指向全局对象。 2.第二种是方法调用模式,如果一个函数作为一个对象的方法来调用时,this 指向这个对象。 3.第三种是构造器调用模式,如果一个函数用 new 调用时,函数执行前会新创建一个对象,this 指向这个新创建的对象。 4.第四种是 apply 、 call 和 bind 调用模式,这三个方法都可以显示的指定调用函数的 this 指向。其中 apply 方法接收两个参数:一个是 this 绑定的对象,一个是参数数组。call 方法接收的参数,第一个是 this 绑定的对象,后面的其余参数是传入函数执行的参数。也就是说,在使用 call() 方法时,传递给函数的参数必须逐个列举出来。bind 方法通过传入一个对象,返回一个 this 绑定了传入对象的新函数。这个函数的 this 指向除了使用 new 时会被改变,其他情况下都不会改变。 这四种方式,使用构造器调用模式的优先级最高,然后是 apply 、 call 和 bind 调用模式,然后是方法调用模式,然后 是函数调用模式。

剑曼红尘 2020-04-03 15:19:04 0 浏览量 回答数 0

回答

方法一:最直白的方式:字面量模式创建 复制代码 1 复制代码 这种方法代码量多,用于“一开始就确定好内部数据类型的”对象创建。 方法二:调用系统构造函数创建 复制代码 1 复制代码 这种方法可以先调用Object来创建一个空的对象,然后动态地在后面添加对象需要的属性,但是代码量也很多。当创建一个跟它相似的对象时可能会重复使用到添加属性的代码语句,不够简洁。 方法三:工厂模式创建 复制代码 1 复制代码 这种方法可以解决方法二的问题,即要创建多个相似的对象时只需要调用多次函数就好,但是工厂模式创建对象无法识别对象的类型,它们都是Object()构造函数创建,都是Object类型(所有的对象都是Object的后代),不像其他方法Array()、Date()等. 方法四:自定义构造函数创建 构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。另外就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用。 复制代码 1 复制代码 这种方法与工厂模式创建有几个不同点:1.函数名Person是大写,而工厂模式的函数creatPerson是小写(习惯上这样用而已);2.该方法没有return语句,而工厂函数创建有return;3.该方法直接将属性和方法赋值给了this对象,而工厂模式没有出现this对象;4.该方法通过new操作符来实例化一个对象,而工厂模式实例化对象直接调用函数即可。 要创建Person的新实例,必须使用new操作符。用这种方式调用构造函数实际上会经历以下四个步骤: 1.创建一个新对象;2.将构造函数的作用域赋给新对象(因此this就指向了这个新对象);3.为这个新对象添加属性;4.返回新对象。 这种方法虽然好用,但也不是没有问题。例如当你需要创建100个Person,这100个对象都是单独的个体,它们之间的私有属性是不相等的,当创建100个这样的对象时,加入一个对象中有一个方法,那创建100个对象就要创建100个方法,但是这些方法都是一样的功能,就没有这个必要去浪费内存空间。所以开始就有了下面的方法五了。 方法五:原型模式创建对象 原型模式有一个强大的功能就是可以实现数据共享,从而节省空间,比如上面的100个对象有100个功能一样的方法,那我完全可以让这100个对象共用一个方法。 复制代码 1

景凌凯 2020-04-03 22:14:13 0 浏览量 回答数 0

问题

JavaScript【构造函数】指的是什么?

小旋风柴进 2019-12-01 19:37:39 890 浏览量 回答数 1

回答

闭包是关于变量作用域链的闭包建立在函数声明阶段,而非执行阶段闭包是依附在函数对象上的JS垃圾回收是基于引用计数的函数执行时生成的局部变量在函数执行完毕后就会从执行栈中清除掉,但不意味着者可以GC掉,还要看其是否被引用那么我们回到问题`$button1=$("#button1");$button2=$("#button2");`声明了$button1变量和$button2变量function Panel(){} Panel.prototype.activate=function(){ var a=1; $button2.click(function(){ a+=1; }); }定义了Panel函数,声明了一个匿名函数A,在匿名函数内部声明了一个内部变量a,引用了变量$button2,并在内部同事声明了一个匿名函数A1,将会使用到其定义时所处的函数的内部变量a;至此就会形成2个闭包,[闭包1]一个针对Panel函数原型对象的activate方法(函数)的闭包-可以能访问非内部变量$button2;[闭包2] 一个针对匿名函数的闭包-可以/需要访问activate函数的内部变量a$button1.click(function(){ new Panel().activate(); });声明了一个匿名函数B,其需要访问Panel构造函数,所以匿名函数还有又构成一个闭包[闭包3]-可以/需要范围访问Panel构造函数在函数声明阶段完成,也就是词法作用域分析结束后开始代码的执行,为Panel函数原型添加了一个方法activate并将其指向声明的匿名函数A为$button1绑定click事件回调匿名函数B当$button1触发click事件后,匿名函数B被执行,利用闭包能够访问到Panel函数,进而新建了一个Panel对象,并执行了activate方法,初始化变量a,用到闭包能够访问到$button2,为$button2绑定click事件回调匿名函数A1.当$button2触发click事件,匿名函数A1就被访问,利用前面的闭包能够访问a匿名函数A1/匿名函数B分别绑定在$button2,$button1上的,这个2个对象都函数都还有引用,所以执行完了以后函数对象不会被GC掉,那么闭包也就保留着,闭包保留着,那么对其中的变量就会有引用存在,那么变量就不会被清除的闭包中的变量并不会随着函数的执行完毕而被清除掉,反而会一直保留着,除非这个闭包被清除-也就是闭包中涉及的变量再也没有被别的函数引用到。例如function add10(init){ var a=10; var add=function(){ a+=10; } add(); return a; } console.log(add10(10));//输出20add函数就会形成一个闭包,可以/需要访问变量a但在add10函数执行完了后,闭包将会消失,因为没有其它对象会引用到函数add,那么可以GC掉add,闭包也就失去了其依赖的对象,也就会被GC掉

小旋风柴进 2019-12-02 02:24:47 0 浏览量 回答数 0

问题

java中为什么父类构造函数必须执行?

蛮大人123 2019-12-01 20:00:42 1385 浏览量 回答数 1

回答

首先out是System类的静态变量,其类型是PrintStream, println()是PrintStream的一个静态函数,如果其参数为对象,则调用该对象的toString()函数, 你程序里days[0]是个你自定义的Date对象,该对象没定义toString()这个函数,但Java中所有的类最终都继承自java.lang.Object对象,所以此时调用的是java.lang.Object.toString()这个函数, 根据java API中的这个函数的说明,其输出的是:getClass().getName() + '@' + Integer.toHexString(hashCode()),也就是:类名@16进制形式的hashCode。 同样Date没定义hashCode()这个函数,所以调用的是 java.lang.Object.hashCode(),这个函数输出的是该对象在内存中的地址。 所以结果就是:Date@20f0691c 详情请参考Java API文档,地址:http://docs.oracle.com/javase/7/docs/api/

爵霸 2019-12-02 02:40:03 0 浏览量 回答数 0

回答

js中一切东西都是对象,函数也是var obj = function(){}你使用这个obj和使用一个对象思想是一致的。既然是对象那当然是实例另外说点题外话js中一切都是对象,函数是一等公民,注意没有类啊比如我们的Object,Array,Number,等他们都是函数,并不是我们类比Java等其他语言中的类一样var obj = new Object这个本质上是函数的构造器调用模式,可不是如同C++中用类名来new 一个对象那么简单。js中没有类的概念,没有从类生产对象的概念,因此在js中谈实例是不合适的。使用对象更复合js的内涵

51干警网 2019-12-02 01:34:24 0 浏览量 回答数 0

回答

js中一切东西都是对象,函数也是var obj = function(){}你使用这个obj和使用一个对象思想是一致的。既然是对象那当然是实例另外说点题外话js中一切都是对象,函数是一等公民,注意没有类啊比如我们的Object,Array,Number,等他们都是函数,并不是我们类比Java等其他语言中的类一样var obj = new Object这个本质上是函数的构造器调用模式,可不是如同C++中用类名来new 一个对象那么简单。js中没有类的概念,没有从类生产对象的概念,因此在js中谈实例是不合适的。使用对象更复合js的内涵

小旋风柴进 2019-12-02 02:29:58 0 浏览量 回答数 0

回答

首先不要用面向对象的思考方式去看js因为js是偏向函数式语言的。因此所谓的基本类型和引用类型只是为了类比java等语言而来的东东。 js中是函数当道,比如这个Number他实际上是一个函数名字,不是类型的概念。函数和普通的变量都是对象。(具有属性和方法的封装体)js中的“继承”是通过原型链完成的。基本类型就是这个链条的末端。如同一棵树的叶子节点。 记住js中没有类型的概念。只有对象。这才是动态性的真谛。下面为了描述方便成为类型 比如Number和 var a=3Number是函数名字,也是一个函数对象这个变量a所谓的“基本类型”就是从Number的原型来的Number.prototype 所以基本类型就是 该变量对应的上层函数的prototype 比如 数字123 它的类型是 Number.prototype字符串 他的类型是 String.prototype数组 他的类型是 Array.prototype 等等。 但是上面的Number,String等都是函数,不是类型哦 下面的例子可以看出基本类型也可以有方法的所以不要用java的观点去看比如 a=123让a可以调用一个toString()方法打印出 [123]来使用nodejs平台进行试验:下面方法中的this就是我们的叶子的值,看到this你还认为他是简单的基本类型吗? Number.prototype.toString = function(){ console.log("["+this+"]"); } var a = 123; a.toString(); 从上面可以看出基本类型也是可以有方法的。可以通过原型来扩充方法那么他和所谓的引用类型又有多大的区别呢? 记住一切都是函数这些常见的值都是函数生成的对象没有类型只说

云栖技术 2019-12-02 02:31:30 0 浏览量 回答数 0

回答

首先要明白,函数在javascript中也是一个对象,函数对象由Function构造而来,所以fn.constructor为Function()。再有,fn的另一种身份是构造函数,作为构造函数,所以拥有一个prototype,这个prototype是一个对象,所以fn.prototype是一个Object。最后,就像楼上所说的,在javascript规范中有说明,构造函数有一个prototype,这个prototype中有一个constructor属性,这个属性指向构造函数自身。

a123456678 2019-12-02 03:10:49 0 浏览量 回答数 0

回答

在Python语言中除了def语句用来定义函数之外,还可以使用匿名函数lambda,它是Python一种生成函数对象的表达式形式。匿名函数通常是创建了可以被调用的函数,它返回了函数,而并没有将这个函数命名,普通函数需要去依靠函数名去调用而匿名函数没有,所以需要把这个函数对象复制给某个变量进行调用 lambda有时被叫做匿名函数也就是这个原因,需要一个函数,又不想动脑筋去想名字,这就是匿名函数。

大财主 2019-12-02 01:07:09 0 浏览量 回答数 0

回答

其实这:function(){}就是一个对象,给的例子Funciotn()也是作为/*下面这个函数其实就是Function的对象,它跟:var Function = new Function(); 是等价的,它又将作为window的属性存在着*/它的一个对象存在着(你知道,JavaScript中对象也可以有自己的对象属性)。这样看他们都是一样-是一个对象。为什么很多地方都使用你说的那种形式来写JavaScript的代码呢?因为在JavaScript中代码的效率非常重要,一个函数对象在被执行完了之后,系统就会将它销毁,但是如果是一个全局属性的话,只有等到整个窗口被销毁的时候这些属性才会被销毁。像我上面那样的写法,Fucntion()函数在被执行完之后会被系统立马销毁掉,但是函数function (){//function content}还会作为一个全局的属性(前提是我们将它定义成全局)直到窗口销毁它才会被销毁,但是我们后面不会再调用它了。这样,如果有很有这样的属性或者是函数的话,会白白的浪费很多的系统资源。(function(){})();这种写法就很合理了,这个函数执行完之后立马就被销毁掉,节省了系统的开销。

杨冬芳 2019-12-02 02:56:16 0 浏览量 回答数 0

回答

应该是第一个方式里面,首先有一个DOM元素对象button,然后人为定义button的属性onclick是一个闭包函数,在JS里面,闭包函数是可以访问外层函数的变量,也就是onclick的闭包函数里面引用到了button元素,即使你没有使用这个东西,这就循环引用了。逻辑上来说就是:如果要释放button对象,需要先删除onclick函数,可是删除onclick函数就需要先释放对button对象的引用,然后要释放button的引用又需要先删除onclick函数,就这样死循环下去,内存泄漏了。

a123456678 2019-12-02 03:08:48 0 浏览量 回答数 0

回答

auto/register/extern表示的是变量的存储位置和作用域。auto变量存储在函数的堆栈空间,register存储在寄存器,extern表示这里没有新定义变量,只是扩展了一个已有全局变量的作用域。类和结构体中的变量是成员变量,其存储位置和作用域由定义对象的函数决定,不由这些对象自己决定。例如,你定义了一个类,complex,然后你在函数main中有如下语句:auto complex c;这就表示c这个对象在函数堆栈中存储。那么,c中的real和imaginary自然也在堆栈中了。同时,他们的生存期也仅限于函数内部。因此,你不需要,也不能单独给对象的成员变量规定存储位置和作用域。PS:auto/register现在已经很不常用了,并不建议再用这两个关键字。

a123456678 2019-12-02 02:01:38 0 浏览量 回答数 0

回答

在 js 中我们是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性值,这个属性值是一个对 象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当我们使用构造函数新建一个对象后,在这个对象的内部 将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。一般来说我们 是不应该能够获取到这个值的,但是现在浏览器中都实现了 proto 属性来让我们访问这个属性,但是我们最好不要使用这 个属性,因为它不是规范中规定的。ES5 中新增了一个 Object.getPrototypeOf() 方法,我们可以通过这个方法来获取对 象的原型。 当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又 会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就 是我们新建的对象为什么能够使用 toString() 等方法的原因。 特点: JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与 之相关的对象也会继承这一改变。

剑曼红尘 2020-04-02 13:35:25 0 浏览量 回答数 0

回答

我的理解是利用构造函数模式创建的实例是互不相同的,那么由构造函数产生的实例的属性也是互不相同的,虽然创建一个Function新实例的机制是一样的,但是他们已经不是在一个作用域链上了。另外你可以从new关键字的含义上理解:创建一个空对象将空对象的__proto__指向构造函数的prototype使用空对象作为上下文调用构造函数所以通过new Function产生的实例并不是同一个实例

a123456678 2019-12-02 02:05:45 0 浏览量 回答数 0

回答

$本身就是一个JQuery函数,$('selectA')就相当于给这个函数$传递了一个字符串,这个函数执行后返回一个jQuery对象,然后我们就可以在对象上进行操作了,例如修改内容,修改样式。题主所给的代码实际上是一个语句--给document的ready事件绑定一个回调函数,当ready事件触发后,就会执行回调函数,在回调函数中也是如此,绑定事件,传入回调函数。

小旋风柴进 2019-12-02 02:28:04 0 浏览量 回答数 0

问题

php 对数据库的操作,使用 过程化 和 对象化 单词都是一样的码?

a123456678 2019-12-01 20:16:38 824 浏览量 回答数 1

回答

his指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行

a123456678 2019-12-02 02:00:15 0 浏览量 回答数 0

回答

我按照执行顺序给你写注释好了。Person p1 = new Person(10); //创建了一个对象 //p1.age=10; modify(p1); //modify函数传参,创建了一个在modify函数里面的局部变量p //你应该明白p是一个新的变量,这里类似于执行了p=p1,这两个是指向的同一个对象的 //p.age=10; p = new Person(20); //注意,这里!这里! //这里是p被重新赋值了,p指向了新的对象new Person(20); //p.age=20; //和p1指向的那个对象一毛线关系都没有啊所以,你的代码是在函数内部,把局部变量给重新赋值了。是没法修改到外面的对象的,因为你已经把唯一能访问到外面那个p1的p给重新赋值了!`public static void modify(Person p){ p.age=20; //只有这样才能修改对象!}`同理,如果你写成这样:`public static void modify(Person p){ p = null;//对外面的p1没有任何影响}`我举个例子,你就比较好理解了。你创建了一个100000000个元素的数组,比如就叫p1,你把数组通过参数传进函数里面,那么:这个参数p(类似于p = p1),p和p1他们是指向同一个对象。不是说modify(int[] p)重新创建了100000000个元素的数组。这个应该很好理解。那么:然后你通过p的内置函数怎么操作p都行,都是操作的那100000000个元素的数组。但是,你不能把p重新赋值啊。重新赋值它就不是之前那个数组啦!比如:你重新p = new int[100000000],就创建了一个新的100000000个元素的数组啊。你执行p = null,也只是销毁了这个引用,不让它指向100000000个元素的数组而已。对外面p1的那个数组不会再有任何影响了。关于JAVA的函数传参数,你应该也听说过,所谓"基本数据类型是传递的值,其它都是传递的引用"。个人理解是这样的。你传递个Person的对象进去,你可以用SetAge()什么的修改这个对象。但是基本的数据类型,比如Integer、String等等,他们没有什么内置函数能改变他们自己。所以,你传递进去一个int的参数,就算其实是传递的引用,你也只能对int做重新赋值,一重新赋值,就表现成传递的是"值"(永远影响不到函数外面)。

蛮大人123 2019-12-02 01:58:52 0 浏览量 回答数 0

回答

箭头函数有几个使用注意点。 (1)函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。 (2)不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。 (3)不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。 (4)不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。 上面四点中,第一点尤其值得注意。this 对象的指向是可变的,但是在箭头函数中,它是固定的。 function foo() { setTimeout(() => { console.log("id:", this.id); }, 100); } var id = 21; foo.call({ id: 42 }); // id: 42

茶什i 2019-12-02 03:21:16 0 浏览量 回答数 0

回答

这一小节的目的是向读者说明“构造函数的方式”创建对象存在一个问题:每个方法都要在每个实力上重新创造一遍。为什么呢?因为每通过构造函数new一个实例,构造函数中的代码就要执行一遍。对于字段属性来说,每个实例的字段本来就应该是独立的,当然没有问题;但是对于方法属性,我们是希望所有的实例是共享同一个的。为了让读者明白为什么不同实例里面的方法是不同的,作者提醒读者不要忘了函数也是一种“对象”,是Function的实例。为了表达的更清楚,作者把方法定义从this.sayName = function(){...}换成了this.sayName = new Function(...)。目的是让读者不要忘记函数(方法)也是对象的本质,所以每new一次都会产生不同的方法。至于你问的问题,作者是在说:我为了解释问题,把方法定义换了一种形式,这“会导致不同的作用域链和标识符解析”,但是定义函数的本质不变,即不同实例得到了不同的方法。

a123456678 2019-12-02 02:05:47 0 浏览量 回答数 0

回答

作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和 函数。 作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前 端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。 当我们查找一个变量时,如果当前执行环境中没有找到,我们可以沿着作用域链向后查找。 作用域链的创建过程跟执行上下文的建立有关....

剑曼红尘 2020-04-03 15:17:37 0 浏览量 回答数 0

回答

我了解的 js 中实现继承的几种方式有: (1)第一种是以原型链的方式来实现继承,但是这种实现方式存在的缺点是,在包含有引用类型的数据时,会被所有的实例对象所共享,容易造成修改的混乱。还有就是在创建子类型的时候不能向超类型传递参数。 (2)第二种方式是使用借用构造函数的方式,这种方式是通过在子类型的函数中调用超类型的构造函数来实现的,这一种方法解决了不能向超类型传递参数的缺点,但是它存在的一个问题就是无法实现函数方法的复用,并且超类型原型定义的方法子类型也没有办法访问到。 (3)第三种方式是组合继承,组合继承是将原型链和借用构造函数组合起来使用的一种方式。通过借用构造函数的方式来实现类型的属性的继承,通过将子类型的原型设置为超类型的实例来实现方法的继承。这种方式解决了上面的两种模式单独使用时的问题,但是由于我们是以超类型的实例来作为子类型的原型,所以调用了两次超类的构造函数,造成了子类型的原型中多了很多不必要的属性。 (4)第四种方式是原型式继承,原型式继承的主要思路就是基于已有的对象来创建新的对象,实现的原理是,向函数中传入一个对象,然后返回一个以这个对象为原型的对象。这种继承的思路主要不是为了实现创造一种新的类型,只是对某个对象实现一种简单继承,ES5 中定义的 Object.create() 方法就是原型式继承的实现。缺点与原型链方式相同。 (5)第五种方式是寄生式继承,寄生式继承的思路是创建一个用于封装继承过程的函数,通过传入一个对象,然后复制一个对象的副本,然后对象进行扩展,最后返回这个对象。这个扩展的过程就可以理解是一种继承。这种继承的优点就是对一个简单对象实现继承,如果这个对象不是我们的自定义类型时。缺点是没有办法实现函数的复用。 (6)第六种方式是寄生式组合继承,组合继承的缺点就是使用超类型的实例做为子类型的原型,导致添加了不必要的原型属性。寄生式组合继承的方式是使用超类型的原型的副本来作为子类型的原型,这样就避免了创建不必要的属性。

剑曼红尘 2020-04-03 15:14:53 0 浏览量 回答数 0

回答

es6 是一个新的标准,它包含了许多新的语言特性和库,是 JS 最实质性的一次升级。 比如'箭头函数'、'字符串模板'、'generators(生成器)'、'async/await'、'解构赋值'、'class'等等,还有就是引入 module 模块的概念。 箭头函数可以让 this 指向固定化,这种特性很有利于封装回调函数 (1)函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。 (2)不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。 (3)不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 Rest 参数代替。 (4)不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。 async/await 是写异步代码的新方式,以前的方法有回调函数和 Promise。 async/await 是基于 Promise 实现的,它不能用于普通的回调函数。async/await 与 Promise 一样,是非阻塞的。 async/await 使得异步代码看起来像同步代码,这正是它的魔力所在。

茶什i 2019-12-02 03:21:15 0 浏览量 回答数 0

回答

new 是动态分配的, 都是动态绑定的,只是绑定的对象,有虚函数表的时候,虚函数表的函数指针指向的是具体动态创建的子类的函数而已。 编译器多态值得一般是是函数重载,泛型编程等。是代码层面的多态。######写得挺好######不错!######mark######个人感觉:在没用支持多态的话,所有的函数都是在编译器就进行了绑定,此时仅仅是根据指针的类型进行函数的绑定。也就是指针声明为什么类型,就在相应的类中绑定这个函数。但是当出现了多态性之后,因为 这个函数是虚函数,这时的函数绑定就不应该以指针或引用的声明为准,而应该在运行时,通过对象的vptr查找虚函数表,进而再确定应该调用那个函数。######挺好的

kun坤 2020-06-06 13:42:32 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站