摘要:閉包正是可以做到這一點(diǎn),因?yàn)樗粫?huì)釋放外部的引用,從而函數(shù)內(nèi)部的值可以得以保留。利用方法進(jìn)行對(duì)象的深拷貝可以避免源對(duì)象被篡改的可能。我們也可以使用方法進(jìn)行對(duì)象的拷貝,方法可以創(chuàng)建一個(gè)具有指定原型對(duì)象和屬性的新對(duì)象。
HTML5
使用FileReader實(shí)現(xiàn)前端圖片預(yù)覽
獲取到頁(yè)面中所有的checkbox怎么做?(不使用第三方框架)
JavaScript模版引擎小實(shí)例
Javascript實(shí)現(xiàn)JS函數(shù)重載
JS跨瀏覽器綁定事件函數(shù)
JS單體模式
使用prototype屬性定義的對(duì)象方法
閉包實(shí)現(xiàn)結(jié)果緩存
閉包實(shí)現(xiàn)封裝
閉包實(shí)現(xiàn)類和繼承
如何判斷某變量是否為數(shù)組數(shù)據(jù)類型?
Javascript繼承-借用構(gòu)造函數(shù)
Javascript原型-封裝
通過閉包修正函數(shù)的上下文(bind 瀏覽器不支持解決方案)
優(yōu)化JavaScript的構(gòu)造函數(shù)(new關(guān)鍵字的使用)
柯里化
對(duì)象拷貝與賦值
CSS居中
菜單欄下拉
JQueryJQ設(shè)置等高的列
HTML5 使用FileReader實(shí)現(xiàn)前端圖片預(yù)覽數(shù)據(jù)
var data = [ { title: "", href: "", imgSrc: "" }, ... ];
方法一:
var doc = document, template = doc.querySelector("#template").innerHTML, result = doc.querySelector(".result"), fragment = ""; for (var i = 0, len = data.length; i < len; i++) { fragment += template .replace(/{{title}}/, data[i].title) .replace(/{{href}}/, data[i].href) .replace(/{{imgSrc}}/, data[i].imgSrc) } result.innerHTML = fragment;
方法二:
var doc = document, template = doc.querySelector("#template").innerHTML, result = doc.querySelector(".result"), attachTemplateToData; attachTemplateToData = function (template, data) { var i = 0, len = data.length, fragment = ""; function replace(obj) { var t, key, reg; for (key in obj) { reg = new RegExp("{{" + key + "}}", "ig"); t = (t || template).replace(reg, obj[key]); } return t; } for (; i < len; i++) { fragment += replace(data[i]); } return fragment; }; result.innerHTML = attachTemplateToData(template, data);JavaScript 實(shí)現(xiàn)JS函數(shù)重載
var people = { values: ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"] }; function addMethod(object, name, fn) { var old = object[name]; object[name] = function () { if (fn.length === arguments.length) { return fn.apply(this, arguments); } else if (typeof old === "function") { return old.apply(this, arguments); } } } addMethod(people, "find", function () { return this.values; }); addMethod(people, "find", function (firstName) { var ret = []; for (var i = 0; i < this.values.length; i++) { if (this.values[i].indexOf(firstName) === 0) { ret.push(this.values[i]); } } return ret; }); addMethod(people, "find", function (firstName, lastName) { var ret = []; for (var i = 0; i < this.values.length; i++) { if (this.values[i] === (firstName + " " + lastName)) { ret.push(this.values[i]); } } return ret; }); console.log(people.find()); console.log(people.find("Sam")); console.log(people.find("Dean Edwards"));JS跨瀏覽器綁定事件函數(shù)
常規(guī)實(shí)現(xiàn)方法
//跨瀏覽器添加事件 function addHandler(target, eventType, handler) { //檢測(cè)瀏覽器類型,并且重寫addHandler方法 if (target.addEventListener) { addHandler = function (target, eventType, handler) { target.addEventListener(eventType, handler, false); } } else { //IE addHandler = function (target, eventType, handler) { target.attachEvent("on" + eventType, handler); } } //調(diào)用新的函數(shù) addHandler(target, eventType, handler); } //跨瀏覽器移除事件 function removeHandler(target, eventType, handler) { //檢測(cè)瀏覽器類型,并且重寫addHandler方法 if (target.addEventListener) { removeHandler = function (target, eventType, handler) { target.removeEventListener(eventType, handler, false); } } else { //IE removeHandler = function (target, eventType, handler) { target.detachEvent("on", eventType, handler); } } target.detachEvent("on" + eventType, handler); }
優(yōu)化方法
//綁定事件 var addHandler = document.body.addEventListener ? function (target, eventType, handler) {//DOM2 target.addEventListener(eventType, handler, false); } : function (target, eventType, handler) {//IE target.attachEvent("on" + eventType, handler); }; //移除事件 var removeHandler = document.body.removeEventListener ? function (target, eventType, handler) { target.removeEventListener(eventType, handler, false); } : function (target, eventType, handler) { target.detachEvent("on" + eventType, handler); };JS單體模式
var shoppingCar = (function () { //這個(gè)是由購(gòu)物車構(gòu)造器所創(chuàng)建的實(shí)例 var instance; //購(gòu)物車的構(gòu)造器函數(shù) function Trolley() { this.date = new Date().getDate();//實(shí)例屬性,當(dāng)前日期 } //原型屬性,一個(gè)返回當(dāng)前日期的方法 Trolley.prototype.getDate = function () { return this.date; }; //暴露出去的公共API return function () { //如果實(shí)例不存在,那么就調(diào)用Trolley構(gòu)造器實(shí)例化一個(gè) if (!instance) { instance = new Trolley(); } //將實(shí)例返回外部 return instance; } }()); var a = new shoppingCar(); var b = new shoppingCar(); console.log(a === b);//true使用prototype屬性定義的對(duì)象方法
var dom = function () {}; dom.Show = function () { alert("Show Message"); }; dom.prototype.Display = function () { alert("Property Message"); }; dom.Display(); //error dom.Show(); //Show Message var d = new dom(); d.Display(); //Property Message d.Show(); //error
閉包實(shí)現(xiàn)結(jié)果緩存1、不使用prototype屬性定義的對(duì)象方法,是靜態(tài)方法,只能直接用類名進(jìn)行調(diào)用!另外,此靜態(tài)方法中無(wú)法使用this變量來(lái)調(diào)用對(duì)象其他的屬性!
2、使用prototype屬性定義的對(duì)象方法,是非靜態(tài)方法,只有在實(shí)例化后才能使用!其方法內(nèi)部可以this來(lái)引用對(duì)象自身中的其他屬性!
var CachedSearchBox = (function () { var cache = {}, table = []; return { attachSearchBox: function (dsid) { if (dsid in cache) { //如果結(jié)果在緩存中 return cache[dsid]; //直接返回緩存中的對(duì)象 } var fsb = new uikit.webctrl.SearchBox(dsid);//新建 cache[dsid] = fsb;//更新緩存 if (count.length > 100) { delete cache[shift()]; } return fsb; }, clearSearchBox: function (dsid) { if (dsid in cache) { cache[dsid].clearSelection(); } } } })(); CachedSearchBox.attachSearchBox("input");
閉包實(shí)現(xiàn)封裝我們開發(fā)中會(huì)碰到很多情況,設(shè)想我們有一個(gè)處理過程很耗時(shí)的函數(shù)對(duì)象,每次調(diào)用都會(huì)花費(fèi)很長(zhǎng)時(shí)間,
那么我們就需要將計(jì)算出來(lái)的值存儲(chǔ)起來(lái),當(dāng)調(diào)用這個(gè)函數(shù)的時(shí)候,首先在緩存中查找,如果找不到,則進(jìn)行計(jì)算,然后更新緩存并返回值,如果找到了,直接返回查找到的值即可。閉包正是可以做到這一點(diǎn),因?yàn)樗粫?huì)釋放外部的引用,從而函數(shù)內(nèi)部的值可以得以保留。
var person = function () { var name = "Default"; return { getName: function () { return name; }, setName: function (newName) { name = newName; } } }(); console.log(person.name);//undefined console.log(person.getName());//Default person.setName("GoodMan"); console.log(person.getName());//GoodMan閉包實(shí)現(xiàn)類和繼承
function Person() { var name = "default"; return { getName: function () { return name; }, setName: function (newName) { name = newName; } } } var p = new Person(); p.setName("Tom"); console.log(p.getName()); var Jack = function () { }; Jack.prototype = new Person();//繼承自Person Jack.prototype.Say = function () { //添加私有方法 console.log("Hello,my name is Jack"); }; var j = new Jack(); j.setName("Jack");//Tom j.Say();//Hello,my name is Jack console.log(j.getName());//Jack如何判斷某變量是否為數(shù)組數(shù)據(jù)類型
if (typeof Array.isArray === "undefined") { Array.isArray = function (arg) { return Object.prototype.toString.call(arg) === "[object Array]" }; }Javascript繼承-借用構(gòu)造函數(shù)
var Widget = function (name) { this.messages = []; }; Widget.prototype.type = "Widget"; var SubWidget = function (name) { Widget.apply(this, Array.prototype.slice.call(arguments)); this.name = name; }; SubWidget.prototype = Widget.prototype; var sub1 = new SubWidget("foo"); var sub2 = new SubWidget("bar"); sub1.messages.push("foo"); sub2.messages.push("bar"); console.log(sub1.messages);//foo console.log(sub2.messages);//barJavascript原型-封裝
var Dialog = (function () { function Dialog() { } Dialog.prototype = { init: function () { console.log("ok"); } }; return Dialog; }()); var d = new Dialog(); d.init();//ok通過閉包修正函數(shù)的上下文(瀏覽器不支持解決方案)
if (!("bind" in Function.prototype)) { Function.prototype.bind = function () { var fn = this, context = arguments[0], args = Array.prototype.slice.call(arguments, 1); return function () { return fn.apply(context, args.concat(arguments)); } } }優(yōu)化JavaScript的構(gòu)造函數(shù)(new關(guān)鍵字的使用)
方法一: function User(name, age) { if (typeof Object.create === "undefined") { Object.create = function (prototype) { function C() { C.prototype = prototype; return new C(); } } } var self = this instanceof User ? this : Object.create(User.prototype); self.name = name; self.age = age; return self; } 方法二: function Programmer(name, company, expertise) { if (!(this instanceof Programmer)) { return new Programmer(name, company, expertise); } this.name = name; this.company = company; this.expertise = expertise; this.writeCode = function () { console.log("Writing some public static thing..") } }柯里化
var curry = function (fn) { var limit = fn.length; return function judgeCurry(...args) { return function (...args) { if (args.length >= limit) { return fn.apply(null, args); } else { return function (...args2) { return judgeCurry.apply(null, args.concat(args2)) } } } } }; var currySingle = fn => judgeCurry = (...args) => args.length >= fn.length ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2));對(duì)象拷貝與賦值
var obj = { name: "xiaoming", age: 23 }; var newObj = obj; newObj.name = "xiaohua"; console.log(obj.name);//xiaohua console.log(newObj.name);//xiaohua
我們將obj對(duì)象賦值給了newObj對(duì)象,從而改變newObj的name屬性,但是obj對(duì)象的name屬性也被篡改,這是因?yàn)閷?shí)際上newObj對(duì)象獲得的只是一個(gè)內(nèi)存地址,而不是真正的拷貝,所以obj對(duì)象被篡改。
var obj = { name: "xiaoming", age: 23 }; var newObj = Object.assign({}, obj, {color: "blue"}); newObj.name = "xiaohua"; console.log(obj.name);//xiaoming console.log(newObj.name);//xiaohua console.log(newObj.color);//blue
利用Object.assign()方法進(jìn)行對(duì)象的深拷貝可以避免源對(duì)象被篡改的可能。因?yàn)?b>Object.assign()方法可以把任意多個(gè)的源對(duì)象自身的可枚舉屬性拷貝給目標(biāo)對(duì)象,然后返回目標(biāo)對(duì)象。
var obj = { name: "xiaoming", age: 23 }; var newObj = Object.create(obj); newObj.name = "xiaohua"; console.log(obj.name);//xiaoming console.log(newObj.name);//xiaohua
我們也可以使用Object.create()方法進(jìn)行對(duì)象的拷貝,Object.create()方法可以創(chuàng)建一個(gè)具有指定原型對(duì)象和屬性的新對(duì)象。
CSS 居中#main { width: 440px; margin: 0 auto; position: relative; text-align: center; }菜單欄下拉
.menu > li { display: block; float: left; position: relative; }JQuery JQ設(shè)置等高的列
First Line
Second Line
Third Line
Column Two
$(function () { equalHeight(".equalHeight"); }); var maxHeight = 0; function equalHeight(col) { col = $(col); col.each(function () { if ($(this).height() > maxHeight) { maxHeight = $(this).height() } }); col.height(maxHeight); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/89138.html
摘要:計(jì)算數(shù)組的極值微信面試題獲取元素的最終前端掘金一題目用代碼求出頁(yè)面上一個(gè)元素的最終的,不考慮瀏覽器,不考慮元素情況。 Excuse me?這個(gè)前端面試在搞事! - 前端 - 掘金金三銀四搞事季,前端這個(gè)近年的熱門領(lǐng)域,搞事氣氛特別強(qiáng)烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來(lái)幫這個(gè)搞事 boy 轉(zhuǎn)述一下。 以下是我一個(gè)朋友的故事,真的不是我。 ... ja...
摘要:你應(yīng)該知道的種設(shè)計(jì)模式前端掘金每位開發(fā)者都努力寫出可維護(hù)的易讀的可復(fù)用的代碼。繼承關(guān)系本前端書籍整理,高清前端掘金發(fā)現(xiàn)了一個(gè)下載前端書籍的地方,分享給大家。 你應(yīng)該知道的 4 種 JavaScript 設(shè)計(jì)模式 - 前端 - 掘金每位開發(fā)者都努力寫出可維護(hù)的、易讀的、可復(fù)用的代碼。隨著應(yīng)用變得越來(lái)越大,代碼的結(jié)構(gòu)也越來(lái)越重要。設(shè)計(jì)模式驗(yàn)證了解決這個(gè)挑戰(zhàn)的重點(diǎn)——在特定環(huán)境中,對(duì)同類事物...
摘要:自適應(yīng)的橢圓背景知識(shí)屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經(jīng)常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 如何在 Vue.js 中使用第三方庫(kù) - 前端 - 掘金在諸多 Vue.js 應(yīng)用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫(kù)....
摘要:自適應(yīng)的橢圓背景知識(shí)屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經(jīng)常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 如何在 Vue.js 中使用第三方庫(kù) - 前端 - 掘金在諸多 Vue.js 應(yīng)用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫(kù)....
摘要:但是,表情在提交代碼的時(shí)候也不能亂用,否則官方應(yīng)用產(chǎn)品掘金掘金溫馨提示這篇文章有很多交互效果,經(jīng)過稀土君測(cè)試不適合在移動(dòng)設(shè)備上閱讀。您可以收藏后再到掘金的網(wǎng)頁(yè)版上繼續(xù)閱讀。我偏要在手機(jī)上閱讀戳一行代碼實(shí)現(xiàn)前端小應(yīng)用前端掘金 全套 Emoji 矢量圖 - 設(shè)計(jì) - 掘金 哇,設(shè)計(jì)師的福音... 談?wù)?Emoji 和字符編碼 - 閱讀 - 掘金 字符編碼是計(jì)算機(jī)原理中一個(gè)很重要的一環(huán),然而...
閱讀 3420·2021-11-15 11:39
閱讀 1552·2021-09-22 10:02
閱讀 1309·2021-08-27 16:24
閱讀 3596·2019-08-30 15:52
閱讀 3412·2019-08-29 16:20
閱讀 824·2019-08-28 18:12
閱讀 550·2019-08-26 18:27
閱讀 716·2019-08-26 13:32