首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解new运算符

Person.sayHello() // Uncaught TypeError: Person.sayHello is not a function Person 是一个普通的函数,当它与 new 运算符一起使用时...,Person 就是一个构造函数。...因此,通过 new 创建的实例对象和构造函数之间建立了一条原型链,并通过原型链赋予实例对象继承属性的能力。...new 的原理和实现 通过上面的分析,new 运算符内部做了如下四个操作: 创建一个空的简单 JavaScript 对象(即{}); 链接新对象(即设置该新对象的构造函数)到函数对象; 将新创建的对象作为...对象(即{}),链接新对象(即设置该新对象的构造函数)到函数对象 return fn.apply(o, args) || o } 使用 newOperator 函数测试上面 Person 的例子:

39010
您找到你想要的搜索结果了吗?
是的
没有找到

原生JS灵魂之问,看看你是否熟悉JavaScript?

new被调用后做了三件事情: 让实例可以访问到私有属性 让实例可以访问构造函数原型(constructor.prototype)所在原型链上的属性 如果构造函数返回的结果不是引用数据类型 function...对于普通函数,绑定this指向 对于构造函数,要保证原函数的原型对象上的属性不能丢失 Function.prototype.bind = function (context, ...args) {...主要这些场隐式绑定的场景讨论: 全局上下文 直接调用函数 对象.方法的形式调用 DOM事件绑定(特殊) new构造函数绑定 箭头函数 1....5. new+构造函数 此时构造函数中的this指向实例对象。 6. 箭头函数? 箭头函数没有this, 因此也不能绑定。...每个普通函数都是 Function的实例,而箭头函数不是任何类的实例,每次调用都是不一样的引用。那我们只需要 处理普通函数的情况,箭头函数直接返回它本身就好了。 那么如何来区分两者呢?

1.3K20

JS 继承

构造函数、原型对象和实例之间的关系 要弄懂extends继承之前,先来复习一下构造函数、原型对象和实例之间的关系。...构造函数(Parent) 结合代码和图可以知道, ES6extends 继承,主要就是: 把子类构造函数( Child)的原型( proto)指向了父类构造函数( Parent)。...子类构造函数 Child继承了父类构造函数 Preant的里的属性。使用 super调用的( ES5则用 call或者 apply调用传参)。也就是图中用不同颜色标记的两条线。...); } } // 按照它们的属性描述符 把方法和静态属性赋值到构造函数的prototype和构造函数上 function _defineProperties(target, props) {...回顾寄生组合式继承,主要就是三点: 子类构造函数的 proto指向父类构造器,继承父类的静态方法 子类构造函数的 prototype的 proto指向父类构造器的 prototype,继承父类的方法。

2.9K32

TypeScript 4.2 正式发布:更智能的类型别名保留,声明缺失的帮助函数,还有许多破坏性更新

使用类型,你可以准确声明你的函数接收什么类型参数,返回什么类型结果。然后,你可以使用 TypeScript 类型检查器来捕获许多常见错误,例如拼写错误、忘记处理null和undefined等等。...标记 逻辑表达式中改进的调用函数检查 解构变量可以显式标记为使用 可选属性和字符串索引符号之间的宽松规则 声明缺失的帮助函数 破坏性更新 更智能的类型别名保留 TypeScript 有一种为类型声明新名称的方法...let Ctor: abstract new () => HasArea = Shape; // ^^^^^^^^ 将abstract修饰符添加到一个构造符号上,你可以传递abstract构造器。...的进一步改进,TypeScript 的调用函数检查现在可以用于&&和||表达式。...如上所述,在使用--strictNullChecks时,调用的函数检查现在将在&&和||表达式中一致地操作。

3.2K20

面试官问:JS的继承

构造函数、原型对象和实例之间的关系 要弄懂extends继承之前,先来复习一下构造函数、原型对象和实例之间的关系。...ES6extends 继承,主要就是: 1.把子类构造函数( Child)的原型( __proto__)指向了父类构造函数( Parent), 2.把子类实例 child的原型对象( Child.prototype...3.子类构造函数 Child继承了父类构造函数 Preant的里的属性。使用 super调用的( ES5则用 call或者 apply调用传参)。也就是图中用不同颜色标记的两条线。...); } } // 按照它们的属性描述符 把方法和静态属性赋值到构造函数的prototype和构造函数上 function _defineProperties(target, props) {...主要就是三点: 1.子类构造函数的 __proto__指向父类构造器,继承父类的静态方法。

72610

红宝书 4:class 继承的重点

函数构造函数一样,多数编程风格都建议类名的首字母要大写,以区别于通过它创建的实例。...("p1") 类构造函数构造函数的主要区别是,这样写会报错: class Animal {} let a = Animal(); // TypeError: class constructor Animal...(2) 这个新对象内部的[[Prototype]]指针被赋值为构造函数的 prototype 属性。 (3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。...(4) 执行构造函数内部的代码(给新对象添加属性)。 (5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。 特性 从各方面来看,ECMAScript 类就是一种特殊函数。...让我们再回顾构造函数继承和原型链继承 2 个经典的问题: ① 构造函数继承的问题:构造函数外在原型上定义方法,不能重用 function SuperType(){} SuperType.prototype.sayName

19620

性能大杀器:c++中的copy elision

Default ctor PS:本文中所使用的编译器及版本为gcc 11.4.0,如果做显式说明,在编译过程中都加上-std=c++11选项。...// 通过调用拷贝构造函数,将T2值赋值给o1 Default ctor // 创建临时变量temp Copy ctor // temp以复制拷贝的方式赋值给CreateObj1()函数返回值...,此处假设为temp2 Copy ctor // 通过调用拷贝构造函数,将temp2值赋值给o2 在上一节中,我们提到过,可以通过使用移动构造的方式来避免拷贝,为了测试该功能,尝试在Obj类中新增一个移动构造函数...,编译器可以优化掉拷贝或移动操作,直接将自动对象构造函数调用的返回对象中。...好了,如果我们在编译选项中去掉-fno-elide-constructors,那么输出如下: Default ctor Default ctor 通过这个输出,可以看出,编译器忽略了拷贝构造函数的调用,

10710

32个常考的手写面试题,值得动手练一练

; 新函数可能被当做构造函数调用; 函数可能有返回值; 实现方法: bind 方法不会立即执行,需要返回一个待执行的函数;(闭包) 实现作用域绑定(apply) 参数传递(apply 的数组传参) 当作为构造函数的时候...由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。...一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤 function Ctor(){ .... } function myNew(ctor,...args){...); //创建一个继承自ctor.prototype的新对象 var ctorReturnResult = ctor.apply(newObj, args); //将构造函数ctor的this绑定到...instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

58720

1000多个项目中的十大JavaScript错误以及如何避免

二是当通过异步的方式获取数据时,无论是在构造函数中 componentWillMount 中,还是在构造函数中提取 componentDidMount,组件在数据加载之前至少会渲染一次。...解决的方法很简单:在构造函数中使用合理的默认值进行状态初始化。...(unknown): Script Error 当捕获的 JavaScript 错误违背跨边界原则时,就会发生脚本错误。...例如,如果将 JavaScript 代码托管在 CDN 上,则任何未被捕获的错误(通过 window.onerror 处理程序发出的错误,而不是 try-catch 中捕获到的错误)将仅报告为“脚本错误...TypeError: ‘undefined’ Is Not a Function 当调用未定义的函数时,Chrome 中就会发生这样的错误。 ?

8.2K40
领券