用构造函数属性覆盖JavaScript中的方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用构造函数属性覆盖JavaScript中的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1847字,纯文字阅读大概需要3分钟。
内容图文
![用构造函数属性覆盖JavaScript中的方法](/upload/InfoBanner/zyjiaocheng/703/a68f2f7a3be14f5693f07a997347a632.jpg)
这是一种在JavaScript中实现方法覆盖的良好/安全的跨浏览器方式吗? :
function Person(firstName, lastName)
{
this.firstName = firstName;
this.lastName = lastName;
};
Person.prototype.sayHi = function()
{
return "Hi, my name is " + this.firstName;
};
function Employee(firstName, lastName, position)
{
Person.call(this, firstName, lastName);
this.position = position;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.sayHi = function()
{
return this.constructor.prototype.sayHi() + " I'm a " + this.position;
}
我也可以写:
Employee.prototype.sayHi = function()
{
return Person.prototype.sayHi() + " I'm a " + this.position;
}
但是这个解决方案我指的是直接方法,或者
Employee.prototype.sayHi = function()
{
return this.__proto__.sayHi() + " I'm a " + this.position;
}
但这个很糟糕而不是交叉浏览器.
编辑:我假设Object.create是crossbrowser,因为我可以使用垫片
解决方法:
您不应该依赖原型的构造函数属性来调用父函数,因为通常,该属性应该指向子构造函数.
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
还有一些其他方法可以安全地访问父函数,比如直接引用父原型,就像你在第二个例子中试图做的那样,但是你的方式有问题.
如果你在不使用call或apply的情况下调用sayHi,这将在函数调用期间指向Person.prototype,这不是你想要的.
您应该通过将上下文对象设置为当前员工实例来调用sayHi,如下所示:
Employee.prototype.sayHi = function() {
return Person.prototype.sayHi.call(this) + " I'm a " + this.position;
};
另一种方法是在子原型中存储对父原型的引用.
Employee.prototype.super = Person.prototoype;
Employee.prototype.sayHi = function() {
return this.super.sayHi.call(this) + " I'm a " + this.position;
};
我看到的另一个有趣的方法是将一个子原型的每个函数包装在一个函数中,该函数动态设置对象实例上父函数的引用,这样你只能使用this.parent()来调用该函数.但是,我不推荐这种解决方案,因为它会降低性能并增加内存使用量.
我创建了一个jsFiddle来展示这个概念.
内容总结
以上是互联网集市为您收集整理的用构造函数属性覆盖JavaScript中的方法全部内容,希望文章能够帮你解决用构造函数属性覆盖JavaScript中的方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。