Javascript 什么是原型,$.extend和;把这个退回来;你必须做什么?
我在做一个遗留项目,我对它的作用感到困惑Javascript 什么是原型,$.extend和;把这个退回来;你必须做什么?,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我在做一个遗留项目,我对它的作用感到困惑 define(['jquery', 'components/BaseComponent', 'bootstrap'], function( $, BaseComponent, bootstrap ) { 'use strict'; return BaseComponent.extend({ initialize: function(options) { BaseComponent.pr
define(['jquery', 'components/BaseComponent', 'bootstrap'], function(
$, BaseComponent, bootstrap
) {
'use strict';
return BaseComponent.extend({
initialize: function(options) {
BaseComponent.prototype.initialize.call(this, options); // what is this man?
this.widgetOptions = $.extend({}, options); // what is this man?
return this; // what is this man?
},
render: function() {
BaseComponent.prototype.render.call(this); //again?
return this; //again?
}
});
});
我有开发木偶应用程序的经验,但上面的代码仍然让我困惑。没有文档,执行此操作的人已经离开。继承和调用父函数
首先,一些信息:
- 介绍
是一个构造函数(),它具有。这个helper函数包含了该函数的一些复杂性BaseComponent
是包含函数和属性的父类的原型BaseComponent.prototype
是父类(BaseComponent.prototype.initialize
)的一个函数,我们通过为此模块定义一个新的BaseComponent
来覆盖它initialize
选项的属性。这是使用,它使一个浅拷贝
这是一个很好的模式,因为:
它确保this.widgetOptions
是一个对象
它是一个副本,因此您可以安全地修改属性,而不会影响接收到的选项
对象(调用代码可以重用该对象)
链接函数调用
这样做的目的是:
myView.render().lookImChaining().functionCalls();
在render
函数中,它是主干标准。但是在initialize中,它没有任何意义,因为您从未实际手动调用initialize
从:
一个好的约定是在渲染结束时返回该值以启用
连锁电话
委员会:
继承和调用父函数
首先,一些信息:
- 介绍
BaseComponent
是一个构造函数(),它具有。这个helper函数包含了该函数的一些复杂性
BaseComponent.prototype
是包含函数和属性的父类的原型
BaseComponent.prototype.initialize
是父类(BaseComponent
)的一个函数,我们通过为此模块定义一个新的initialize
来覆盖它
“类”的函数包含在。通过对父对象原型中的函数使用,我们可以在当前对象的上下文中调用该函数
复制对象
这将创建一个新对象,其中将复制选项的属性。这是使用,它使一个浅拷贝
这是一个很好的模式,因为:
它确保this.widgetOptions
是一个对象
它是一个副本,因此您可以安全地修改属性,而不会影响接收到的选项
对象(调用代码可以重用该对象)
链接函数调用
这样做的目的是:
myView.render().lookImChaining().functionCalls();
在render
函数中,它是主干标准。但是在initialize中,它没有任何意义,因为您从未实际手动调用initialize
从:
一个好的约定是在渲染结束时返回该值以启用
连锁电话
委员会:
所有这些都是基本的JavaScript模式。事实上,链接不仅限于JavaScript,因为链接在许多编程语言中都是适用的。所有这些都是基本的JavaScript模式。事实上,链接不仅限于JavaScript,因为链接在许多编程语言中都是适用的。重写意味着什么?我们可以使用BaseComponent
中提供的方法?prototype
如何在这里发挥作用?为什么不仅仅是BaseComponent.initialize.call()
?过度隐藏意味着您的BaseComponent有一个名为initialize的方法,而您发布的代码也有一个同名的方法,因为您是从BaseComponent继承的,所以您的代码会覆盖BaseComponent的initialize方法。请尝试从BaseComponent.prototype.initialize.call(此选项)中删除该原型字。您将获得最大调用堆栈大小Reach错误,因为initialize将继续调用自身。@JessJordan我添加了许多指向其他信息的链接。重写意味着什么?我们可以使用BaseComponent
中提供的方法?prototype
如何在这里发挥作用?为什么不仅仅是BaseComponent.initialize.call()
?过度隐藏意味着您的BaseComponent有一个名为initialize的方法,而您发布的代码也有一个同名的方法,因为您是从BaseComponent继承的,所以您的代码会覆盖BaseComponent的initialize方法。请尝试从BaseComponent.prototype.initialize.call(此选项)中删除该原型字。您将获得最大调用堆栈大小Reach错误,因为initialize将继续调用自身。@Jessi添加了许多指向其他信息的链接。
return this; // what is this man?
myView.render().lookImChaining().functionCalls();
render: function() {
return this;
},