prototype.js批评 [英] prototype.js criticism

查看:65
本文介绍了prototype.js批评的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我一直在阅读最近的帖子以及

comp.lang.javascript的旧档案,并对所表达的观点感到惊讶关于

prototype.js库有几个原因:


1)该库被称为垃圾库。很多次这是对图书馆相对较高的人气的强烈反对意见。我知道人气并不能让人感觉良好。


2)建议使用它的人获得最小的线索。 (转述。

搜索档案" prototype.js minimal" ;.)


3)批评如此强烈的人必须相信他们知道的更好但是

我看到包含批评的帖子没有说明为什么

库是如此糟糕。


我使用了prototype.js库有点混合经验。


我对Enumerable迭代器的成功很少。常数

问题。他们制作的代码足够大,可以匹配JavaScript for循环的大小。在Ruby中,这些类型的方法都很棒,但是我不认为它们在JavaScript中工作得很好,就像prototype.js

实现它们一样。


我很喜欢使用prototype.js的事件部分而没有任何

问题,甚至没有阅读任何代码。它通常是一个

库的目标,因此用户不必知道图书馆的'b
内部。我认为这是prototype.js的成功。但是,在阅读了这些批评之后,我决定查看代码中的代码。

我到目前为止幸运的情况。事实证明,对于我的应用程序,我只需要大约90行prototype.js的1800行。

。这些

行如下。我现在读完了。他们似乎对我好。我想

知道是否有人认为这是原型的弱部分.js

库以及为什么?特别是关于浏览器的评论

不兼容性解决方法以及克服IE的问题

this关键词和冒泡(在
http://www.quirksmode上讨论.org / js / events_advanced.html)


我希望有一件事是prototype.js使用了命名空间(讨论过
http://blog.dreamprojections.com/arc...2/27 /450.aspx)。这个

意味着使用该库的代码看起来不那么酷

因为它不可能扩展Event,Function,String等。


你对prototype.js有什么喜欢或不喜欢?任何理由为什么

prototype.js是垃圾?


我认为对这个图书馆的批判性讨论会非常有教育意义

适合很多人。我知道我正试图获得最小的线索。


谢谢,

彼得

// - -------------------------------------------------- --------


Function.prototype.bindAsEventListener = function(object){

var __method = this;

返回函数(事件){

返回__method.call(object,event || window.event);

}

};


函数$(){

var elements = new Array();


for(var i = 0; i< arguments.length; i ++){

var element = arguments [i];

if(typeof element ==''string'')

element = document.getElementById(element);


if(arguments.length == 1)

return element;


elements.push(元素);

}


返回元素;

};


// ------------------------------------ -------------------------------


Event.element = fu nction(event){

return event.target || event.srcElement;

};


Event.stop = function(event){

if(event.preventDefault){

event.preventDefault();

event.stopPropagation();

} else {

event.returnValue = false;

event.cancelBubble = true;

}

};


事件。 observers = false;


Event._observeAndCache = function(element,name,observer,useCapture)

{

if(! this.observers)this.observers = new Array();

if(element.addEventListener){

this.observers.push([element,name,observer,useCapture ]);

element.addEventListener(name,observer,useCapture);

} else if(element.attachEvent){

this.observers .push([element,name,observer,useCapture]);

element.attachEvent(''on''+ name,observer);

}

};


Event.unloadCache = function(){

if(!Event.observers)return;

for(var i = 0;我< Event.observers.length; i ++){

Event.stopObserving.apply(this,Event.observers [i]);

Event.observers [i] [0] = null;

}

Event.observers = false;

};


Event.observe = function(element, name,observer,useCapture){

var element = $(element);

useCapture = useCapture ||假;


if(name ==''keypress''&&

(navigator.appVersion.match(/ Konqueror | Safari | KHTML / )

|| element.attachEvent))

name =''keydown'';


this._observeAndCache(element, name,observer,useCapture);

};


Event.stopObserving = function(element,name,observer,useCapture){

var element = $(element);

useCapture = useCapture ||假;


if(name ==''keypress''&&

(navigator.appVersion.match(/ Konqueror | Safari | KHTML / )

|| element.detachEvent))

name =''keydown'';


if(element.removeEventListener) {

element.removeEventListener(name,observer,useCapture);

} else if(element.detachEvent){

element.detachEvent(' 'on''+ name,observer);

}

};


/ *防止IE * /中的内存泄漏

Event.observe(window,''unload'',Event.unloadCache,false);

解决方案

< blockquote>(){

var elements = new Array();


for(var i = 0; i< arguments.length; i ++){

var element = arguments [i];

if(typeof element ==''string'')

element = document.getElementById(元素);


if(arguments.length == 1)

返回元素;


elements.push(element);

}


返回元素;

};


// --------------------------------------- ----------------------------


Event.element = function(event){

返回event.target || event.srcElement;

};


Event.stop = function(event){

if(event.preventDefault){

event.preventDefault();

event.stopPropagation();

} else {

event.returnValue = false;

event.cancelBubble = true;

}

};


事件。 observers = false;


Event._observeAndCache = function(element,name,observer,useCapture)

{

if(! this.observers)this.observers = new Array();

if(element.addEventListener){

this.observers.push([element,name,observer,useCapture ]);

element.addEventListener(name,observer,useCapture);

} else if(element.attachEvent){

this.observers .push([element,name,observer,useCapture]);

element.attachEvent(''on''+ name,observer);

}

};


Event.unloadCache = function(){

if(!Event.observers)return;

for(var i = 0;我< Event.observers.length; i ++){

Event.stopObserving.apply(this,Event.observers [i]);

Event.observers [i] [0] = null;

}

Event.observers = false;

};


Event.observe = function(element, name,observer,useCapture){

var element =


(element);

useCapture = useCapture ||假;


if(name ==''keypress''&&

(navigator.appVersion.match(/ Konqueror | Safari | KHTML / )

|| element.attachEvent))

name =''keydown'';


this._observeAndCache(element, name,observer,useCapture);

};


Event.stopObserving = function(element,name,observer,useCapture){

var element =


(element);

useCapture = useCapture ||假;


if(name ==''keypress''&&

(navigator.appVersion.match(/ Konqueror | Safari | KHTML / )

|| element.detachEvent))

name =''keydown'';


if(element.removeEventListener) {

element.removeEventListener(name,observer,useCapture);

} else if(element.detachEvent){

element.detachEvent(' 'on''+ name,observer);

}

};


/ *防止IE * /中的内存泄漏

Event.observe(window,''unload'',Event.unloadCache,false);


Hi,

I''ve been reading the recent posts and older archives of
comp.lang.javascript and am surprised by the sentiments expressed about
the prototype.js library for a few reasons:

1) The library has been referred to as "junk" many times which is a
strong opinion against the relatively high popularity of the library. I
know popularity doesn''t make something good.

2) People who use it are advised to "get a minimal clue". (Paraphrased.
Search archives "prototype.js minimal".)

3) Those who criticize so strongly must believe they know better but
the posts I saw containing the criticism did not indicate why the
library is so bad.

I have used the prototype.js library a bit with a mixed experience.

I had very little success with the Enumerable iterators. Constant
problems. They make for code that is bulky enough to match the size of
a JavaScript for loop. In Ruby these types of methods are great but I
don''t think they work so well in JavaScript the way prototype.js
implements them.

I have enjoyed using the event parts of prototype.js without any
problems or even reading any of the code. It''s usually the goal of a
library to make it so the user doesn''t have to know the library''s
internals. I''ll count this as a success for prototype.js. However,
after reading such criticisms I decided to look at the code just in
case I got lucky so far. It turns out that for my application I was
able to take only about 90 lines of prototype.js''s 1800 lines. These
lines are below. I''ve read them now. They seem ok to me. I would like
to know if anyone thinks this is a weak part of the prototype.js
library and why? Particularly comments regarding the browser
incompatibility workarounds as well as overcoming the IE problems of
the "this" keyword and bubbling (discussed on
http://www.quirksmode.org/js/events_advanced.html).

One thing I wish was that prototype.js used a namespace (discussed
http://blog.dreamprojections.com/arc...2/27/450.aspx). This
would mean the code that uses the library would not look quite so cool
since it would not be possible to extend Event, Function, String, etc.

What do you like or dislike about prototype.js? Any reasons why
prototype.js is "junk"?

I think a critical discussion of this library would be very educational
for many people. I know that I am trying to "get a minimal clue".

Thanks,
Peter
// ------------------------------------------------------------

Function.prototype.bindAsEventListener = function(object) {
var __method = this;
return function(event) {
return __method.call(object, event || window.event);
}
};

function $() {
var elements = new Array();

for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == ''string'')
element = document.getElementById(element);

if (arguments.length == 1)
return element;

elements.push(element);
}

return elements;
};

// -------------------------------------------------------------------

Event.element = function(event) {
return event.target || event.srcElement;
};

Event.stop = function(event) {
if (event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
event.returnValue = false;
event.cancelBubble = true;
}
};

Event.observers = false;

Event._observeAndCache = function(element, name, observer, useCapture)
{
if (!this.observers) this.observers = new Array();
if (element.addEventListener) {
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {
this.observers.push([element, name, observer, useCapture]);
element.attachEvent(''on'' + name, observer);
}
};

Event.unloadCache = function() {
if (!Event.observers) return;
for (var i = 0; i < Event.observers.length; i++) {
Event.stopObserving.apply(this, Event.observers[i]);
Event.observers[i][0] = null;
}
Event.observers = false;
};

Event.observe = function(element, name, observer, useCapture) {
var element = $(element);
useCapture = useCapture || false;

if (name == ''keypress'' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.attachEvent))
name = ''keydown'';

this._observeAndCache(element, name, observer, useCapture);
};

Event.stopObserving = function(element, name, observer, useCapture) {
var element = $(element);
useCapture = useCapture || false;

if (name == ''keypress'' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.detachEvent))
name = ''keydown'';

if (element.removeEventListener) {
element.removeEventListener(name, observer, useCapture);
} else if (element.detachEvent) {
element.detachEvent(''on'' + name, observer);
}
};

/* prevent memory leaks in IE */
Event.observe(window, ''unload'', Event.unloadCache, false);

解决方案

() {
var elements = new Array();

for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == ''string'')
element = document.getElementById(element);

if (arguments.length == 1)
return element;

elements.push(element);
}

return elements;
};

// -------------------------------------------------------------------

Event.element = function(event) {
return event.target || event.srcElement;
};

Event.stop = function(event) {
if (event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
event.returnValue = false;
event.cancelBubble = true;
}
};

Event.observers = false;

Event._observeAndCache = function(element, name, observer, useCapture)
{
if (!this.observers) this.observers = new Array();
if (element.addEventListener) {
this.observers.push([element, name, observer, useCapture]);
element.addEventListener(name, observer, useCapture);
} else if (element.attachEvent) {
this.observers.push([element, name, observer, useCapture]);
element.attachEvent(''on'' + name, observer);
}
};

Event.unloadCache = function() {
if (!Event.observers) return;
for (var i = 0; i < Event.observers.length; i++) {
Event.stopObserving.apply(this, Event.observers[i]);
Event.observers[i][0] = null;
}
Event.observers = false;
};

Event.observe = function(element, name, observer, useCapture) {
var element =


(element);
useCapture = useCapture || false;

if (name == ''keypress'' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.attachEvent))
name = ''keydown'';

this._observeAndCache(element, name, observer, useCapture);
};

Event.stopObserving = function(element, name, observer, useCapture) {
var element =


(element);
useCapture = useCapture || false;

if (name == ''keypress'' &&
(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
|| element.detachEvent))
name = ''keydown'';

if (element.removeEventListener) {
element.removeEventListener(name, observer, useCapture);
} else if (element.detachEvent) {
element.detachEvent(''on'' + name, observer);
}
};

/* prevent memory leaks in IE */
Event.observe(window, ''unload'', Event.unloadCache, false);


这篇关于prototype.js批评的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆