[ 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

黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除