[ Javascript ]破解坚果,覆盖 Object.constructor()
[ Javascript ]破解坚果,覆盖 Object.constructor()
原文:https://medium.com/hackernoon/javascript-cracking-nuts-override-object-constructor-48a73628b7e6

unsplash.com
我一如既往地喜欢 javascript。但是每次当我被要求用 OOP 模式编程时,我都很受伤。所有这些主题:对象、类、原型、继承等等。,是开发者的痛,这是 JS“比较散漫的脾气”和“自动类型转换强迫症”的个性造成的。
这是一个来自stack overflow:的例子
第一,兔子是一个对象,具有公共有价值的 *跳跃**默认值【是】* 。
function Rabbit() {
***this.jumps = "yes";*** };
var rabbit = new Rabbit();
console.log(rabbit.jumps); // yes
console.log(Rabbit.prototype.constructor);
// outputs exactly the code of the function Rabbit();
第二,我们要更改 Rabbit()中的代码,使 var 跳转 与不同的 默认值“no”。 嗯,修改对象的默认值,有 对象 。【prototype . constructor(),直觉告诉我修改构造函数,问题就解决了。 但 却不是。
Rabbit.prototype.constructor = function Rabbit() {
***this.jumps = "no";*** };
console.log(Rabbit.prototype.constructor);
// again outputs the code with new this.jumps = "no";
var rabbit2 = new Rabbit();
// create new object with new constructor
***console.log(rabbit2.jumps); // still*** ***yes***
发生的事情是 Rabbit.prototype.constructor 只是一个指向原始构造函数(函数 Rabit(){…})的指针,因此“类”的用户可以从实例中检测到构造函数。
由胡安
如果你想重定义一个构造函数,就这么做
var oldProto = Rabbit.prototype;
Rabbit = function() {
this.jumps = "no";
};Rabbit.prototype = oldProto;
你也喜欢坚果系列:
【express js】override RES . send 【express js】将 IP 放入黑名单
喜欢这个故事?对别人有帮助吗?这有助于我知道你是否想看到更多关于他的主题,并帮助人们看到这个故事, 当点击下面的心 。
参考:
为什么不能从原型改变构造函数? http://js-bits . blogspot . tw/2010/08/JavaScript-inheritance-done-right . html
2010 年 8 月 17 日星期二 Javascript 继承完成正确 http://stack overflow . com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype



