真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

關(guān)于實(shí)現(xiàn)javascript的信息

javascript有哪些實(shí)現(xiàn)?

JavaScript有很多實(shí)現(xiàn),以下列舉幾個(gè)比較出名的實(shí)現(xiàn):

企業(yè)官網(wǎng)是企業(yè)形象的一張重要名片。創(chuàng)新互聯(lián)的成都官網(wǎng)定制服務(wù),能夠?qū)⒊啥季W(wǎng)頁(yè)設(shè)計(jì)與企業(yè)的實(shí)力&公信力、產(chǎn)品服務(wù)優(yōu)勢(shì)、文化價(jià)值觀等有機(jī)結(jié)合,把握企業(yè)的獨(dú)特之處,突出重點(diǎn)核心內(nèi)容,并以恰如其分的設(shè)計(jì)風(fēng)格,抓住目標(biāo)用戶的關(guān)注點(diǎn)和興趣點(diǎn),幫助企業(yè)塑造好第一印象,成都全網(wǎng)營(yíng)銷展現(xiàn)公司實(shí)力。成都官網(wǎng)定制,為你解決成都創(chuàng)新互聯(lián)網(wǎng)營(yíng)銷解決方案。

Mozilla Firefox的Gecko排版引擎SpiderMonkey及Rhino實(shí)現(xiàn)了ECMA-262的第五版;

Google Chrome的V8排版引擎實(shí)現(xiàn)了ECMA-262的第五版;

Internet Explorer的Trident排版引擎實(shí)現(xiàn)了ECMA-262的第五版;

KHTML排版引擎,用在KDE Konqueror及蘋果公司 Safari實(shí)現(xiàn)了ECMA-262的第三版。

什么是按需加載javascript實(shí)現(xiàn)

其實(shí)按需加載不是很難,你只需要2個(gè)東西就能辦到

一個(gè)模塊加載器

一些符合模塊加載器語(yǔ)法的代碼

首先實(shí)現(xiàn)一個(gè)模塊加載器其實(shí)并不復(fù)雜,不到50行就能辦到,但是如果你想要一個(gè)功能完善的,可配置,具有完善的生態(tài)和社區(qū)的模塊加載器。在幾年前是requirejs和seajs,現(xiàn)在是browserify和webpack。webpack和browserify在模塊加載方面相比requirejs和seajs更高級(jí)的地方是在node環(huán)境下自動(dòng)進(jìn)行依賴分析。

讓我們來(lái)實(shí)現(xiàn)個(gè)簡(jiǎn)單的兼容commonJS規(guī)范的模塊加載器吧。

(function (global) {

var factoryMap = {};

var resMap = {};

var moduleMaps = {};

window.resMap = resMap;

// define函數(shù)定義

define = function (id, factory) {

factoryMap[id] = factory;

}

// require函數(shù)定義

require = function (id) {

var mod = moduleMaps[id] = {

exports: {}

}

var factory = factoryMap[id];

if (!factory) {

throw 'Cannot find module `' + id + '`';

}

var ret = factory.apply(mod, [require, mod.exports, mod]);

if (ret) {

mod.exports = ret;

}

return mod.exports;

}

})(this);

對(duì)于這樣的模塊加載器你就得這樣來(lái)用。

// 模塊1 依賴 模塊二的內(nèi)容

define('module1', function (require, exports, module) {

// console.log(1);

var module2 = require('module2');

var module3 = require('module3');

var module5 = require('module5');

var module6 = require('module6');

console.log('module1 -- module2', module2);

console.log('module1 -- module3', module3);

console.log('module1 -- module5', module5);

console.log('module1 -- module6', module6);

module.exports = {

moduleName: 'module1'

}

})

// 模塊二 依賴 模塊三的內(nèi)容

define('module2', function (require, exports, module) {

var module6 = require('module6');

console.log('module2 -- module6', module6);

module.exports = {

moduleName: 'module2'

}

})

// 模塊三

define('module3', function (require, exports, module) {

// console.log('3');

var module4 = require('module4');

var module5 = require('module5');

var module2 = require('module2');

console.log('module3 -- module5', module5);

console.log('module3 -- module2', module2);

console.log('module3 -- module4', module4);

module.exports = {

moduleName: 'module3'

}

})

define('module4', function (require, exports, module) {

var module6 = require('module6');

console.log('module4 -- module6', module6);

module.exports = {

moduleName: 'module4'

}

});

define('module5', function (require, exports, module) {

var module2 = require('module2');

var module6 = require('module6');

console.log('module5 -- module2', module2);

console.log('module5 -- module6', module6);

module.exports = {

moduleName: 'module5'

}

})

define('module6', function (require, exports, module) {

module.exports = {

moduleName: 'module6'

}

})

require('module1');

可以把所有代碼放到瀏覽器里面實(shí)驗(yàn)一下。。。

JavaScript如何實(shí)現(xiàn)?

監(jiān)聽KeyDown事件,獲取按下的KeyCode

反過(guò)來(lái)對(duì)應(yīng)的KeyUp事件獲取抬起的KeyCode

JavaScript如何實(shí)現(xiàn)兩個(gè)功能?

div style="opacity:1"點(diǎn)我/div

script

document.onclick=function(e){

var div=document.querySelector("div");

div.style.opacity=((e||event).target==divdiv.style.opacity==0)?1:0;

}

/script

javascript實(shí)現(xiàn)

html

head

script

function change_src(){

var label = document.getElementsByTagName("label")[0];

var label_value = label.lastChild.nodeValue;

var img = document.getElementsByTagName("img")[0];

var img_src = label_value + ".jpg";

img.setAttribute( "src", img_src );

}

/script

/head

body onload="change_src()"

labelxue/label

img src="xue.jpg" /

/body

/html

上面代碼可以實(shí)現(xiàn),你自己研究一下~~

javascript實(shí)現(xiàn)繼承有哪些方式

Javascript的繼承在很多書里面細(xì)致的分了很多種類型和實(shí)現(xiàn)方式,大體上就是兩種:對(duì)象冒充、原型方式。這兩種方式各有優(yōu)點(diǎn)和缺陷,這里我給你先列舉出來(lái),再?gòu)牡讓臃治鰠^(qū)別:

(一)對(duì)象冒充

function A(name){

this.name = name;

this.sayHello = function(){alert(this.name+” say Hello!”);};

}

function B(name,id){

this.temp = A;

this.temp(name); //相當(dāng)于new A();

delete this.temp; //防止在以后通過(guò)temp引用覆蓋超類A的屬性和方法

this.id = id;

this.checkId = function(ID){alert(this.id==ID)};

}

當(dāng)構(gòu)造對(duì)象B的時(shí)候,調(diào)用temp相當(dāng)于啟動(dòng)A的構(gòu)造函數(shù),注意這里的上下文環(huán)境中的this對(duì)象是B的實(shí)例,所以在執(zhí)行A構(gòu)造函數(shù)腳本時(shí),所有A的變量 和方法都會(huì)賦值給this所指的對(duì)象,即B的實(shí)例,這樣子就達(dá)到B繼承了A的屬性方法的目的。之后刪除臨時(shí)引用temp,是防止維護(hù)B中對(duì)A的類對(duì)象(注 意不是實(shí)例對(duì)象)的引用更改,因?yàn)楦膖emp會(huì)直接導(dǎo)致類A(注意不是類A的對(duì)象)結(jié)構(gòu)的變化。

我們看到了,在Js版本更新的過(guò)程中,為了更方便的執(zhí)行這種上下文this的切換以達(dá)到繼承或者更加廣義的目的,增加了call和apply函數(shù)。它們的 原理是一樣的,只是參數(shù)不同的版本罷了(一個(gè)可變?nèi)我鈪?shù),一個(gè)必須傳入數(shù)組作為參數(shù)集合)。這里就以call為例子,解釋一下用call實(shí)現(xiàn)的對(duì)象冒充 繼承。

function Rect(width, height){

this.width = width;

this.height = height;

this.area = function(){return this.width*this.height;};

}

function myRect(width, height, name){

Rect .call(this,width,height);

this.name = name;

this.show = function(){

alert(this.name+” with area:”+this.area());

}

}

關(guān)于Call方法,官方解釋:調(diào)用一個(gè)對(duì)象的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

call (thisOb,arg1, arg2…)

這也是一種對(duì)象冒充的繼承,其實(shí)在call方法調(diào)用的時(shí)候發(fā)生的事情也是上下文環(huán)境變量this的替換,在myRect函數(shù)體中this肯定是指向類 myRect對(duì)象的實(shí)例了,然而用這個(gè)this作為上下文環(huán)境變量調(diào)用名字叫Rect方法,即類Rect的構(gòu)造函數(shù)。于是此時(shí)調(diào)用Rect時(shí)候?qū)his 的賦值屬性和方法都實(shí)際上是對(duì)一個(gè)myRect的對(duì)象進(jìn)行。所以說(shuō)盡管call和apply并不是僅僅為了繼承而新增的方法,但用它們可以模擬繼承。

對(duì)象冒充繼承就是這么一回事,它可以實(shí)現(xiàn)多重繼承,只要重復(fù)做這一套賦值的流程就可以了。不過(guò)目前真正大規(guī)模使用得并不多,為什么呢?因?yàn)樗幸粋€(gè)明顯的 性能缺陷,這就要說(shuō)道OO的概念了,我們說(shuō)對(duì)象是成員+成員方法的集合,構(gòu)造對(duì)象實(shí)例的時(shí)候,這些實(shí)例只需要擁有各自的成員變量就可以了,成員方法只是一 段對(duì)變量操作的可執(zhí)行文本區(qū)域而已,這段區(qū)域不用為每個(gè)實(shí)例而復(fù)制一份,所有的實(shí)例都可以共享?,F(xiàn)在回到Js利用對(duì)象冒充模擬的繼承里,所有的成員方法都 是針對(duì)this而創(chuàng)建的,也就是所所有的實(shí)例都會(huì)擁有一份成員方法的副本,這是對(duì)內(nèi)存資源的一種極度浪費(fèi)。其它的缺陷比如說(shuō)對(duì)象冒充無(wú)法繼承 prototype域的變量和方法就不用提了,筆者認(rèn)為前一個(gè)致命缺陷就已經(jīng)足夠。不過(guò),我們還是需要理解它,特別是父類的屬性和方法是如何繼承下來(lái)的原 理,對(duì)于理解Js繼承很重要。

(二)原型方式

第二種繼承方式是原型方式,所謂原型方式的繼承,是指利用了prototype或者說(shuō)以某種方式覆蓋了prototype,從而達(dá)到屬性方法復(fù)制的目的。 其實(shí)現(xiàn)方式有很多中,可能不同框架多少會(huì)有一點(diǎn)區(qū)別,但是我們把握住原理,就不會(huì)有任何不理解的地方了??匆粋€(gè)例子(某一種實(shí)現(xiàn)):

function Person(){

this.name = “Mike”;

this.sayGoodbye = function(){alert(“GoodBye!”);};

}

Person.prototype.sayHello = function(){alert(”Hello!”);};

function Student(){}

Student.prototype = new Person();

關(guān)鍵是對(duì)最后一句Student原型屬性賦值為Person類構(gòu)造的對(duì)象,這里筆者解釋一下父類的屬性和方法是如何copy到子類上的。Js對(duì)象在讀取某 個(gè)對(duì)象屬性的時(shí)候,總是先查看自身域的屬性列表,如果有就返回否則去讀取prototype域(每個(gè)對(duì)象共享構(gòu)造對(duì)象的類的prototype域所有屬性 和方法),如果找到就返回,由于prototype可以指向別的對(duì)象,所以Js解釋器會(huì)遞歸的去查找prototype域指向?qū)ο蟮膒rototype 域,直到prototype為本身,查找變成了一種循環(huán),就停止,此時(shí)還沒(méi)找到就成undefined了。

這樣看來(lái),最后一句發(fā)生的效果就是將父類所有屬性和方法連接到子類的prototype域上,這樣子類就繼承了父類所有的屬性和方法,包括name、 sayGoodbye和sayHello。這里與其把最后一句看成一種賦值,不如理解成一種指向關(guān)系更好一點(diǎn)。這種原型繼承的缺陷也相當(dāng)明顯,就是繼承時(shí) 父類的構(gòu)造函數(shù)時(shí)不能帶參數(shù),因?yàn)閷?duì)子類prototype域的修改是在聲明子類對(duì)象之后才能進(jìn)行,用子類構(gòu)造函數(shù)的參數(shù)去初始化父類屬性是無(wú)法實(shí)現(xiàn)的, 如下所示:

function Person(name){

this.name = name;

}

function Student(name,id){

this.id = id;

}

Student.prototype = new Person(this.name);

兩種繼承方式已經(jīng)講完了,如果我們理解了兩種方式下子類如何把父類的屬性和方法“抓取”下來(lái),就可以自由組合各自的利弊,來(lái)實(shí)現(xiàn)真正合理的Js繼承。下面是個(gè)人總結(jié)的一種綜合方式:

function Person(name){

this.name = name;

}

Person.prototype.sayHello = function(){alert(this.name+“say Hello!”);};

function Student(name,id){

Person.call(this,name);

this.id = id;

}

Student.prototype = new Person();

Student.prototype.show = function(){

alert(“Name is:”+ this.name+” and Id is:”+this.id);

}

總結(jié)就是利用對(duì)象冒充機(jī)制的call方法把父類的屬性給抓取下來(lái),而成員方法盡量寫進(jìn)被所有對(duì)象實(shí)例共享的prototype域中,以防止方法副本重復(fù)創(chuàng) 建。然后子類繼承父類prototype域來(lái)抓取下來(lái)所有的方法。如想徹底理清這些調(diào)用鏈的關(guān)系,推薦大家多關(guān)注Js中prototype的 constructor和對(duì)象的constructor屬性,這里就不多說(shuō)了。


當(dāng)前名稱:關(guān)于實(shí)現(xiàn)javascript的信息
標(biāo)題路徑:http://weahome.cn/article/dsgoioj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部