LJ *_*ski 18 javascript math prototype built-in
我尝试扩展JavaScript Math.但有一件事让我感到惊讶.
当我试图延长它时 prototype
Math.prototype.randomBetween = function (a, b) {
return Math.floor(Math.random() * (b - a + 1) + a);
};
Run Code Online (Sandbox Code Playgroud)
在控制台中我有错误'无法设置属性'randomBetween'的'undefined'...
但是如果我把这个功能赋予了 Math.__proto__
Math.__proto__.randomBetween = function (a, b) {
return Math.floor(Math.random() * (b - a + 1) + a);
};
Run Code Online (Sandbox Code Playgroud)
一切正常.
谁能解释一下为什么它以这种方式工作?我感谢任何帮助.
Ori*_*iol 32
Math不是构造函数,因此它没有prototype属性:
new Math(); // TypeError: Math is not a constructor
Run Code Online (Sandbox Code Playgroud)
相反,只需将您的方法添加Math为自己的属性:
Math.randomBetween = function (a, b) {
return Math.floor(Math.random() * (b - a + 1) + a);
};
Run Code Online (Sandbox Code Playgroud)
你的方法与__proto__作品因为,因为Math是一个Object实例,Math.__proto__是Object.prototype.
但是请注意,您正在randomBetween为所有对象添加方法,而不仅仅是Math.这可能是有问题的,例如在使用循环迭代对象时for...in.
那是因为有 Math一个对象,而不是一个function。
在 javascript 中,afunction大致相当于面向对象语言中的类。 prototype是一个特殊属性,可让您向此类添加实例方法1。当您想扩展该类时,您可以使用prototype它,并且它“正常工作”。
现在让我们想想是什么Math。您永远不会创建数学对象,您只需使用它的方法。事实上,创建两个不同的Math对象是没有意义的,因为Math总是工作相同!换句话说,MathJavaScript 中的对象只是将一堆预先编写的数学相关函数组合在一起的便捷方法。它就像一本普通数学词典。
想要向该组添加一些内容吗?只需向集合中添加一个属性即可!这里有两种简单的方法可以做到这一点。
Math.randomBetween = function() { ... }
Math["randomBetween"] = function() {... }
Run Code Online (Sandbox Code Playgroud)
使用第二种方式可以更明显地看出它是一个字典类型集合,但它们都做同样的事情。
| 归档时间: |
|
| 查看次数: |
5949 次 |
| 最近记录: |