试图理解JavaScript中原型和构造函数之间的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了试图理解JavaScript中原型和构造函数之间的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2969字,纯文字阅读大概需要5分钟。
内容图文
![试图理解JavaScript中原型和构造函数之间的区别](/upload/InfoBanner/zyjiaocheng/706/1d9dc574b97346938ff81a04711523ae.jpg)
我是JavaScript的新手,为了理解这个概念,我已经阅读了许多关于原型和构造函数的文章,但是无论我走到哪里,我都会感到困惑.
当人们同时谈论构造函数和原型时会产生混淆.
在以下示例中
var employee = function Emp(name) {
this.name = name;
}
var jack = new employee("Jack Dwain");
employee.constructor //gives Function()
employee.prototype // gives Emp {}
employee.prototype.constructor //gives Emp(name)
jack.constructor //gives Emp(name)
jack.prototype //gives undefined
> prototype是JS实现继承的一种方式,因为Emp(name)是基函数原型被引用到同一个函数本身.那是怎么回事?
> employee.constructor和employee.prototype.constructor以何种方式不同?
>为什么jack.prototype未定义,即如果它继承自函数Emp(name),为什么它没有引用该函数?
>如何在没有在控制台中输入原型或构造函数或prototype.constructor ……产生的内容的情况下清楚地预测自己
解决方法:
如果你已经习惯了在其他OOP语言中扩展对象的容易性,那么你可以很好地解决这个问题,但是我会尽力解释这些对象的用途以及它们的用途.我假设您熟悉其他OOP语言.如果我错了纠正我.
所有函数都有原型Function().它们继承了函数的所有基本功能,如toString()和valueOf().
然后有一个构造函数.这就是您用来初始化对象的方法.
p = new Foo();
所以在这种情况下我们有两件事.
>函数Foo,函数作为原型(Foo)
>一个带有Foo()作为构造函数的Function对象(p)
(跟我来?)
Foo()构造函数可以覆盖Function构造函数的一些基本功能,但也保持原样,并充分利用它.
如果您熟悉OOP原则,那么原型是基类,是当前类的构造函数.在OOP中,上面将是Foo类扩展函数
您还可以使用整个原型和构造函数的设置开始继承,从而在共享功能的同时制作更复杂的对象.
例如:
// make a object initialiser extending Function. in oop `class Foo extends Function`
function Foo(bar) {
this.baz = bar;
}
Foo.prototype.append = function(what) {
this.baz += " " + what;
};
Foo.prototype.get() {
return this.baz
}
现在让我们说我们想要不同的方法让baz离开那里.一个用于控制台日志记录,一个用于将其放在标题栏上.
我们可以为我们的类Foo做一件大事,但我们不这样做,因为我们需要对新类做完全不同的事情,但是为不同的实现做了.他们唯一需要分享的是baz项目以及setter和getter.
所以我们需要扩展它以使用OOP术语.在OOp中,这将是期望的最终结果类Title extends Foo(){}.所以让我们来看看如何到达那里.
function Title(what) {
this.message = what;
}
此时Title函数如下所示:
>原型功能
>构造函数标题
所以,为了使它扩展到Foo,我们需要改变原型.
Title.prototype = new Foo();
>原型Foo
>构造函数Foo
这是通过针对原型初始化新的Foo()对象来完成的.
现在它基本上是一个名为Title的Foo对象.这不是我们想要的,因为现在我们无法访问Title中的消息部分.
我们可以通过将构造函数重置为Title来使其正确扩展Foo()
Title.prototype.constructor = Title;
>原型Foo
>构造函数标题
现在我们又遇到了一个问题. Foo的构造函数没有初始化,所以最终得到一个未定义的this.baz
要解决这个问题,我们需要调用父级.在java中,你可以使用super(vars),php $parent-> __ construct($vars).
在javascript中,我们必须修改Title类构造函数以调用父对象的构造函数.
所以Title类构造函数会变成
function Title(what) {
Foo.call(this,what);
this.message = what;
}
通过使用函数对象属性Foo继承,我们可以初始化Title对象中的Foo对象.
现在你有一个正确继承的对象.
因此,它不使用像其他OOP语言这样的关键字,而是使用原型和构造函数.
内容总结
以上是互联网集市为您收集整理的试图理解JavaScript中原型和构造函数之间的区别全部内容,希望文章能够帮你解决试图理解JavaScript中原型和构造函数之间的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。