- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图通过了解 Mootools 的内部工作原理来学习 javascript。我正在专门查看这些行:
var Type = this.Type = function(name, object){
if (name){
var lower = name.toLowerCase();
var typeCheck = function(item){
return (typeOf(item) == lower);
};
Type['is' + name] = typeCheck;
if (object != null){
object.prototype.$family = (function(){
return lower;
}).hide();
}
}
if (object == null) return null;
object.extend(this);
object.$constructor = Type;
object.prototype.$constructor = object;
return object;
};
//some more code
new Type('Type',Type);
这里发生了什么?
在底部的构造函数语句中分配给全局窗口对象的对象是什么?
当 Type 函数似乎只更新传入的对象而不是创建新对象时,为什么它被调用为带有 new 语句的构造函数?
特别是 object.extend(this); 行中的“this”是什么? ?它是全局窗口对象,如果是,它是否将该对象的所有键、值对添加到 Type 对象?
最佳答案
天哪,最近的问题似乎更多地集中在 mootools 内部。
我将尽我所知回答,因为我不是核心开发人员。
MooTools 中的Type
与 Class(实际上是 Class constructor itself is a Type)非常相似,但它更侧重于数据/值和值的类型。它还旨在扩展 ECMA 规范定义的原生类型并使它们更加灵活。
我想讨论一般的数据类型没有意义(String
、Number
、Array
、Object
等)。为什么需要扩展它们?好吧,对于初学者来说,Duct Typing 在 js 中有点古怪。 类型{};//对象
, typeof [];//对象
, typeof new Date();//object
等 - 不是最有帮助的,即使因为所有类型都继承自 object 并且将它们组合在一起是合乎逻辑的,它不会帮助您编写代码。
因此,在 js 对象的上下文中,它们是从构造函数对象创建的...
Type 所做的不是替换构造函数,而是通过向其添加新方法或属性来更改现有构造函数。
例如。 new Type('Array', Array);
这会将 native Array 构造函数变成某种类型的对象。您不需要保存结果或任何东西 - 这是一种一次性操作,可以修改原始数据并使其保持打开状态以供操作。
typeOf(数组);//类型
那么,有什么不同呢?好吧,对于初学者来说,typeOf([])
现在能够真正告诉我们它到底是什么 - array
。这里真正发生的是:object.extend(Type);
,神奇的一点。它会将 Type 对象上定义的所有属性复制到目标对象 - 你可以在这里看到它们:
https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L211-232
因此,您新创建的 Type 会立即获得所有重要的 implement
和 extend
方法。
更高级的是,让我们创建一个基于原生 Array 构造函数的新类型:
var foo = new Type('foo', Array),
a = new foo();
// it's a real boy!
a.push('hi');
// ['hi'], foo, object
console.log(a, typeOf(a), typeof a);
但是,如果我们想要自定义类型怎么办?一个神奇而特别的?没问题,因为参数 2 实际上可以是一个(匿名)函数。
var Awesome = new Type('awesome', function(name, surname) {
// console.log('I R teh construct0r!');
this.name = name;
this.surname = surname;
});
// extend it a little.
Awesome.implement({
getName: function() {
return this.name;
},
getSurname: function() {
return this.surname;
}
});
var Dimitar = new Awesome('dimitar', 'christoff');
console.log(typeOf(Dimitar)); // awesome
console.log(Dimitar.getName()); // dimitar
在另一个示例中,查看 DOMEvent。它采用上述内容并将其变成更快更精简的对象类型。 https://github.com/mootools/mootools-core/blob/master/Source/Types/DOMEvent.js#L21
那为什么那不是一个类呢?因为,类(class)更贵,而且事件一直在发生。
希望对您有所帮助。如需更详细的解释,请在邮件列表上询问并希望最好,也许核心开发人员会有时间,因为这不是您的标准“我如何让 Accordion 工作”类型的问题......
关于javascript - mootools 类型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987173/
我试图在Mootools [1.11版]中匹配多个CSS属性,如以下元素所示: 我想匹配具有type ='radio'和value ='dev'属性的元素。尝试了这个,但这不起作用 $$('inpu
问题:是否有到 mootools 核心及更多库的可靠/永久链接? 我升级了 mootools 幻灯片并使其可用 online如果有人需要的话。但希望有一个谷歌链接 对于 javascript 库,但没
我正在使用 MooTools 1.12 如何在悬停时将类添加到 a 元素? 例如 我有这个 Some text Some text Some text Some text anf 当鼠标悬停在链接上时
我继承了一个网站项目,其中大部分脚本都包含 mootools.js(大约 40k)。但是,凭直觉,我还没有看到它在哪里使用,考虑到这个项目的性质,咳咳,我认为它可能根本没有被使用! 今晚我“迫于压力”
我在 Google map 应用程序中使用 Mootools 来做一些事情,例如 bumpboxes 和其他东西。在我添加 Mootools 脚本之前,一切都 100% 正常工作,无论我是在声明我的全
如何使用 Mootools 通过 id 检查元素的存在 最佳答案 html: some content javascript var foo = document.id('foo'); // or $
我正在尝试将大约 200 行 jQuery 代码转换为 MooTools,以避免在现有站点上包含两个库。我只有一行有问题: new Element('span', {text: ' » '
Please select product ... 我尝试使用 Firefox 并且它工作正常 $('selectId').innertHTML = 'Test test' 但在 ie 上,它不
我有 5 个 a 元素需要注入(inject)额外的 span ,而不是创建新元素 5 次我怎么能只做一次呢?我试过了 var holders= $$('.holders'); holders.eac
我有 5 个 a 元素需要注入(inject)额外的 span ,而不是创建新元素 5 次我怎么能只做一次呢?我试过了 var holders= $$('.holders'); holders.eac
有人有在同一页面中使用 Closure js lib 和 Mootools 的经验吗? 有冲突还是工作正常? 最佳答案 根据谷歌: The names of all Closure Library f
我试图让 SqueezeBox 弹出窗口在打开页面时自动打开,但我使用的代码打开了弹出窗口,但弹出内容未加载。 我不太熟悉,因此我需要一些帮助来了解我做错了什么 window.addEvent('do
我正在学习 mootools。我有一个以下格式的数组。我想在 for 循环中遍历它,但不知道该怎么做。 {'apple' : { 'prize' : 10 , 'color' : 'Red' } ,
要在我的网站上设置元素的 html,我主要使用 $('elementId').innerHTML = "text"; 浏览 mootools 文档,我发现给出了这个例子: $('myElement')
我这里有一个 Mootools 1.1 类,我想将其在 Mootools 1.3 中运行。onComplete 函数不知何故无法将“数据”结果发送到 processResults 函数。 Ajax 调
我有这个 Mootools 1.11 脚本,它在提交表单后更新 div,表单将数据发送到“form.php”文件并返回类似“表单已发送”的消息。 我想把它转换成 mootools 1.4.1 Moot
我正在从服务器检索一些数据并更新 div 的 html 内容,如下所示: var req = new Request.JSON({ method: 'get', url: 'index
我看到了用 jquery 获取第二类名称的方法,但是如何在 mootools 中做到这一点,我的元素是 我需要匹配完整的类名,例如 li.parent.active 并调整高度(如果我尝试过该类存在
我正在使用 MooTools,但我似乎无法执行以下代码。我期望它将 #bar 元素的宽度增加到 50px,然后 alert() 带有“hi!”,并且然后继续将#bar的宽度增加到200px。不管出于什
我有一个当前正在调用 .hide() 的 Element 对象。相反,我想将整个元素(及其子元素)的不透明度淡出到 100%(隐藏),作为可能超过 500 毫秒或 1000 毫秒的过渡效果。 Fx.T
我是一名优秀的程序员,十分优秀!