有没有在JavaScript / ActionScript中重新定义Math.constructor

2019-07-29 04:11发布

Math对象没有prototype属性,但是拥有一个constructor属性。 是否有任何案件中,重新定义构造函数将是有益的?

Answer 1:

MDN说:

不像其他的全局对象,Math不是构造函数。 所有属性和数学的方法都是静态的

在其他语言中,当一个类是静态的,可以直接使用它的属性和方法,而不产生类(对象)的实例。 如果使用数学构造,没有提供原生型支持对象,不像原始类型:数字,字符串,布尔。 它们可以转化为他们的包装对象。

此外,它是一种不好的做法来扩展根对象。 如果未来新功能的环境中实现并且代码不具备此故障的安全检查,这将覆盖本地之一。

我个人的意见是,你不构造函数,也不需要原型 - 你可以定义自己的数学函数。 Math对象是这里只是以呈现标准的功能,并给程序员杠杆不限定PiE ,例如。 大概用户定义的数学函数会比内置的要慢好几倍。



Answer 2:

所述Math对象(准确地说:对象通过的初始值称为Math ECMAScript的全局对象的属性) 具有constructor特性,请参见ECMAScript的语言规范,5.1版 ,第15.8节“数学对象”。 因此,

Math.hasOwnProperty("constructor")

返回false (在符合编3和以后的ECMAScript实现)。

所述Math对象继承一个constructor通过从它的原型原型链,其是(同上),“内置Object原型对象(15.2.4)的标准”,这是相同的最初由称为属性Object.prototype属性。 后者对象提供一些有用的性能,如Object.prototype.hasOwnProperty (见上文)。 因此,它是有道理的的原型链Math对象是不是空的,而不是。

Math对象也继承Object.prototype.constructor只不过是ECMAScript实现无条件继承的副作用为(与第4版提案实现的例外,也许未来的版本)的属性没有一个合适的知名度改性剂,以防止(如private几种基于类的语言)。 而且,当然,的构造Object的实例,其从相同的原型继承,是由的初始值所引用的对象Object的全局对象的属性。 所以Object.prototype.constructor必须反映这一点。 因此,评估的结果

Math.constructor === Object

true



Answer 3:

所有的对象都有一个constructor属性,指示创建该对象的构造。

即使({}).constructor返回Object()



Answer 4:

其实,数学没有自己的 “构造”特性。 它继承了“构造”从Object.prototype中,就像它继承“的toString”,“hasOwnProperty”,所有Object.prototype中的其他属性。

对于数学,“构建”可能有非常的小工具。 它只是那里的JavaScript的继承是如何工作的结果,。



Answer 5:

Math对象“继承”从Object (意味着Math.__proto__ === Object.prototype

Math对象是没有更多的任何JavaScript程序员比一个“特殊”,但简单Object附有其实施和建设是自动的和隐藏的方法。

Object.prototype定义了一个.constructor场(实际上任何函数本身分配给自己的原型的构造,看到EX1)

EX1(搁着的一点点):

function xxx() { }
// then:
xxx.prototype.constructor === xxx; // true
// since xxx is a function:
xxx.constructor === Function.prototype.constructor; // true
// and as such:
xxx.constructor === Function; // true

因此,当您使用Math.constructor ,它只是仰视Math对象的这样的原型链(...好样的):

  1. Math - > Math.hasOwnProperty('constructor') === false

  2. NOT FOUND MOVE NEXT

  3. Math.__proto__ - > Math.__proto__.hasOwnProperty('constructor') === true

  4. 找到,返回: Math.__proto__.constructor

所以基本上是:

Math.constructor === Object.prototype.constructor; // true
// and as such:
Math.constructor === Object; // true
// and as stated at the top:
Math.__proto__ === Object.prototype; // true

希望这有助于-ck



Answer 6:

在我看来,在JavaScript中的数学对象尝试模拟在其他流行的编程语言的静态数学行为(例如JAVA)。 因为这只能在JavaScript中进行仿真,所有的对象有默认的原型和构造函数的特性,我的猜测是,开发商可能只是忘了constructor属性设置为undefined ,通过执行明确像Math.constructor = undefined;



Answer 7:

在你需要生成一个转换表,不污染在全球范围内的情况下,这将是有益的。 例如:

Math.constructor = function() {
  var i = 0, unicode = {}, zero_padding = "0000", max = 9999;
  //Loop through code points
  while (i < max) {
    //Convert decimal to hex value, find the character, then pad zeroes to the codepoint
    Math.constructor[String.fromCharCode(parseInt(i, 16))] = ("u" + zero_padding + i).substr(-4);
    i = i + 1;
    }    
  }

调用构造函数来填充它是这样:

Math.constructor();

Math.constructor["a"]

另一个用途将是扩展的属性和方法,以限定用于图形库原语:

root(arg,index)     "index-th" root of argument. Example: root(x,6) sixth root of x, root[tan(x),4] fourth root of the tangent of x.
sqrt()  Square root of argument (number or expression inside the parentheses). Equivalent to root(argument,2)
cbrt()  Cube root of argument. Equivalent to root(argument,3)
logn(arg,base)  Logarithm base-base of arg.
ln()    Natural logarithm of argument (base-E logarithm of argument where E is Euler's constant)
lg()    Logarithm base-10 of argument, equivalent to logn(argument,10).
lb()    Logarithm base-2 of argument.
exp()   Exponential Function E to the power of argument, equivalent to E^argument
sin()   Sine of argument
cos()   Cosine
tan()   Tangent
cot()   Cotangent
sec()   Secant of argument, equiv. to 1/cos(arg).
csc()   Cosecant, equiv. to 1/sin(arg).
asin()  Arc sine
acos()  Arc cosine
atan()  Arc tangent
acot()  Arc cotangent
asec()  Arc secant, inverse secant.
acsc()  Arc cosecant, inverse cosecant.
sinh()  Hyperbolic sine, Sinus hyperbolicus
cosh()  Hyperbolic cosine, Cosinus hyperbolicus
tanh()  Hyperbolic tangent, Tangens hyperbolicus
coth()  Hyperbolic cotangent, Cotangens hyperbolicus
sech()  Hyperbolic secant, Secans hyperbolicus.
csch()  Hyperbolic cosecant, Cosecans hyperbolicus.
asinh()     Area sine, Area sinus hyperbolicus, inverse sinh().
acosh()     Area cosine, Area cosinus hyperbolicus, inverse cosh().
atanh()     Area tangent, Area tangens hyperbolicus, inverse tanh().
acoth()     Area cotangent, Area cotangens hyperbolicus, inverse cotanh().
asech()     Area- secant, Area secans hyperbolicus, inverse sech().
acsch()     Area- cosecant, Area cosecans hyperbolicus, inverse csch().
gaussd(x,mean,sigma)    Gaussian distribution ("Bell Curve"). gaussd(x,0,1), by the way, is the special case "Normal distribution density with mean-value=0, standard-deviation=1".
min(arg1,arg2)  Returns the lesser of the two arguments
max(arg1,arg2)  Returns the greater of the two arguments
round()     Rounds argument up or down to the closest integer
floor()     Rounds arg down.
ceil()  Rounds arg up.
abs() or | |    Absolute value of argument. Example: 2abs(sin[x]) or alternatively 2|sin(x)| .
sgn()   Sign Function. 
rand    Random number between 0 und 1. Example:
pi*rand*sin(x) or even Pirandsin(x) .
E   Euler's constant 2.718281828459045...
LN2     Natural logarithm of 2, is 0.6931471805599453...
LN10    Natural logarithm of 10, is 2.302585092994046...
LOG2E   Base-2 logarithm of E (E: see above), is 1.4426950408889633...
LOG10E  Base-10 logarithmus of E, is 0.4342944819032518...
PHI     Golden Ratio 1.61803398874989...
PI  3.141592653589793...
SQRT1_2     Square root of 1/2, is 0.7071067811865476...
SQRT2   Square root of 2, is 1.4142135623730951... 

参考

  • 增强的JavaScript核心对象

  • 沃尔特·佐恩:在线功能图示器



Answer 8:

   <script type="text/javascript">
    Math.prototype=Math;
    Math.prototype.rand=function(min,max){
        return Math.floor((Math.random() * (max-min+1))+min)
    }

    var o=[];
    for(var i=0;i<100;i++)o.push(Math.rand(-1,1));
    alert(o.join(", "))
    </script>

粗的,你也可以只是做:

Math.rand=function(min,max){
    return Math.floor((Math.random() * (max-min+1))+min)
}

究其原因数学不来与它自己的原型像数组和字符串是因为它不是一个函数,而是一个对象。 既然你可以使用新的String()和新Array()你还可以使用String.prototypeArray.prototype

这同样适用Object, Function, Number, Date, RegExp and even Boolean 。 但是任何定义的函数将被分配一个原型属性,并从功能和任何在它从继承链其他继承。

如果你要正确对待Math就像一个功能,你需要做的就是用一个函数覆盖变量。 这样Math.constructor叫,因为它实际上将被链接到创建它的用户定义的函数时,将不会返回对象。

你可以让原生对象的副本第一,然后丢给你的首要功能的原型属性之一,或使用封装所以只有新的数学函数可以访问本机方法。 不知道还有什么可以在主题可说的。

开放的问题是一种毫无意义的。 Math.constructor将返回对象,也将是一样直接调用对象。 如果你改变了构造函数的唯一的区别是。

你为什么要改变反正构造?

Math对象是完全没有事情是这样的。 如果我们期望它继承的东西的地方,什么将我们期待“ this ”指反正? 如果你能想出一个回答这个问题,你将有一个目的,你可以编写代码的东西。



文章来源: Is there any practical use of redefining Math.constructor in JavaScript/ActionScript?