gpt4 book ai didi

javascript - Math.round 不是构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:05:14 24 4
gpt4 key购买 nike

考虑以下几点:

x = function () {}
p = new x()
console.log(p) // ok

Math.z = function () {}
p = new Math.z()
console.log(p) // ok

p = new Math.round()
console.log(p) // TypeError: function round() { [native code] } is not a constructor

所以我可以将 new 与我自己的函数一起使用,但不能与 Math.round 一起使用。是什么让它如此特别?这在某处记录了吗?

最佳答案

Math.round 没有什么特别之处,您可以在自己的函数中复制此行为:

MyClass = function(){};
MyClass.round = function(x){
if(this instanceof MyClass.round)
throw 'TypeError: MyClass.round is not a constructor';
return Math.round(x);
}

console.log(MyClass.round(0.5)); // 1
new MyClass.round(); // 'TypeError: MyClass.round is not a constructor'

事实上,您可以使用类似的模式使 new 关键字在您的类中成为可选关键字:

function MyClass(){
if(!(this instanceof MyClass)) // If not using new
return new MyClass(); // Create a new instance and return it

// Do normal constructor stuff
this.x = 5;
}

(new MyClass()).x === MyClass().x;

至于为什么 new 不能使用内置函数和方法,这是设计使然,并记录在案:

None of the built-in functions described in this clause that are not constructors shall implement the [[Construct]] internal method unless otherwise specified in the description of a particular function. -- http://es5.github.com/#x15

关于javascript - Math.round 不是构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10477883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com