摘要:閉包正是可以做到這一點,因為它不會釋放外部的引用,從而函數內部的值可以得以保留。利用方法進行對象的深拷貝可以避免源對象被篡改的可能。我們也可以使用方法進行對象的拷貝,方法可以創建一個具有指定原型對象和屬性的新對象。
HTML5
使用FileReader實現前端圖片預覽
獲取到頁面中所有的checkbox怎么做?(不使用第三方框架)
JavaScript模版引擎小實例
Javascript實現JS函數重載
JS跨瀏覽器綁定事件函數
JS單體模式
使用prototype屬性定義的對象方法
閉包實現結果緩存
閉包實現封裝
閉包實現類和繼承
如何判斷某變量是否為數組數據類型?
Javascript繼承-借用構造函數
Javascript原型-封裝
通過閉包修正函數的上下文(bind 瀏覽器不支持解決方案)
優化JavaScript的構造函數(new關鍵字的使用)
柯里化
對象拷貝與賦值
CSS居中
菜單欄下拉
JQueryJQ設置等高的列
HTML5 使用FileReader實現前端圖片預覽數據
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 實現JS函數重載
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跨瀏覽器綁定事件函數
常規實現方法
//跨瀏覽器添加事件 function addHandler(target, eventType, handler) { //檢測瀏覽器類型,并且重寫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); } } //調用新的函數 addHandler(target, eventType, handler); } //跨瀏覽器移除事件 function removeHandler(target, eventType, handler) { //檢測瀏覽器類型,并且重寫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); }
優化方法
//綁定事件 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 () { //這個是由購物車構造器所創建的實例 var instance; //購物車的構造器函數 function Trolley() { this.date = new Date().getDate();//實例屬性,當前日期 } //原型屬性,一個返回當前日期的方法 Trolley.prototype.getDate = function () { return this.date; }; //暴露出去的公共API return function () { //如果實例不存在,那么就調用Trolley構造器實例化一個 if (!instance) { instance = new Trolley(); } //將實例返回外部 return instance; } }()); var a = new shoppingCar(); var b = new shoppingCar(); console.log(a === b);//true使用prototype屬性定義的對象方法
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
閉包實現結果緩存1、不使用prototype屬性定義的對象方法,是靜態方法,只能直接用類名進行調用!另外,此靜態方法中無法使用this變量來調用對象其他的屬性!
2、使用prototype屬性定義的對象方法,是非靜態方法,只有在實例化后才能使用!其方法內部可以this來引用對象自身中的其他屬性!
var CachedSearchBox = (function () { var cache = {}, table = []; return { attachSearchBox: function (dsid) { if (dsid in cache) { //如果結果在緩存中 return cache[dsid]; //直接返回緩存中的對象 } 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");
閉包實現封裝我們開發中會碰到很多情況,設想我們有一個處理過程很耗時的函數對象,每次調用都會花費很長時間,
那么我們就需要將計算出來的值存儲起來,當調用這個函數的時候,首先在緩存中查找,如果找不到,則進行計算,然后更新緩存并返回值,如果找到了,直接返回查找到的值即可。閉包正是可以做到這一點,因為它不會釋放外部的引用,從而函數內部的值可以得以保留。
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閉包實現類和繼承
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如何判斷某變量是否為數組數據類型
if (typeof Array.isArray === "undefined") { Array.isArray = function (arg) { return Object.prototype.toString.call(arg) === "[object Array]" }; }Javascript繼承-借用構造函數
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通過閉包修正函數的上下文(瀏覽器不支持解決方案)
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)); } } }優化JavaScript的構造函數(new關鍵字的使用)
方法一: 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));對象拷貝與賦值
var obj = { name: "xiaoming", age: 23 }; var newObj = obj; newObj.name = "xiaohua"; console.log(obj.name);//xiaohua console.log(newObj.name);//xiaohua
我們將obj對象賦值給了newObj對象,從而改變newObj的name屬性,但是obj對象的name屬性也被篡改,這是因為實際上newObj對象獲得的只是一個內存地址,而不是真正的拷貝,所以obj對象被篡改。
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()方法進行對象的深拷貝可以避免源對象被篡改的可能。因為Object.assign()方法可以把任意多個的源對象自身的可枚舉屬性拷貝給目標對象,然后返回目標對象。
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()方法進行對象的拷貝,Object.create()方法可以創建一個具有指定原型對象和屬性的新對象。
CSS 居中#main { width: 440px; margin: 0 auto; position: relative; text-align: center; }菜單欄下拉
.menu > li { display: block; float: left; position: relative; }JQuery JQ設置等高的列
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); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/115537.html
摘要:計算數組的極值微信面試題獲取元素的最終前端掘金一題目用代碼求出頁面上一個元素的最終的,不考慮瀏覽器,不考慮元素情況。 Excuse me?這個前端面試在搞事! - 前端 - 掘金金三銀四搞事季,前端這個近年的熱門領域,搞事氣氛特別強烈,我朋友小偉最近就在瘋狂面試,遇到了許多有趣的面試官,有趣的面試題,我來幫這個搞事 boy 轉述一下。 以下是我一個朋友的故事,真的不是我。 ... ja...
摘要:你應該知道的種設計模式前端掘金每位開發者都努力寫出可維護的易讀的可復用的代碼。繼承關系本前端書籍整理,高清前端掘金發現了一個下載前端書籍的地方,分享給大家。 你應該知道的 4 種 JavaScript 設計模式 - 前端 - 掘金每位開發者都努力寫出可維護的、易讀的、可復用的代碼。隨著應用變得越來越大,代碼的結構也越來越重要。設計模式驗證了解決這個挑戰的重點——在特定環境中,對同類事物...
摘要:自適應的橢圓背景知識屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進的分布式版本控制系統。 如何在 Vue.js 中使用第三方庫 - 前端 - 掘金在諸多 Vue.js 應用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫....
摘要:自適應的橢圓背景知識屬性的基本用法使用樣式畫各種圖形前端掘金下面是一些我在中經常用到的圖案,還有一些是在看到的。像圖手把手教你使用前端掘金使用教程一是什么是目前世界上最先進的分布式版本控制系統。 如何在 Vue.js 中使用第三方庫 - 前端 - 掘金在諸多 Vue.js 應用中, Lodash, Moment, Axios, Async等都是一些非常有用的 JavaScript 庫....
摘要:但是,表情在提交代碼的時候也不能亂用,否則官方應用產品掘金掘金溫馨提示這篇文章有很多交互效果,經過稀土君測試不適合在移動設備上閱讀。您可以收藏后再到掘金的網頁版上繼續閱讀。我偏要在手機上閱讀戳一行代碼實現前端小應用前端掘金 全套 Emoji 矢量圖 - 設計 - 掘金 哇,設計師的福音... 談談 Emoji 和字符編碼 - 閱讀 - 掘金 字符編碼是計算機原理中一個很重要的一環,然而...
閱讀 3164·2019-08-30 15:55
閱讀 2945·2019-08-30 13:46
閱讀 1446·2019-08-29 17:29
閱讀 3513·2019-08-29 11:08
閱讀 3438·2019-08-29 11:04
閱讀 1088·2019-08-28 18:20
閱讀 545·2019-08-26 13:37
閱讀 1327·2019-08-26 11:49