當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript启示录
生活随笔
收集整理的這篇文章主要介紹了
JavaScript启示录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近閱讀了《JavaScript啟示錄》,一本很薄但是內容卻很充實的書籍。展現了準確的JavaScript世界觀,涉及對象、屬性、復雜值、原始值、作用域、繼承、this關鍵字、head對象等重要概念。
示例:
var myStr1 = "foo"; var myStr2 = myStr1; var myStr3 = "foo"; console.log(myStr2 === myStr3); //結果:truemyStr1 = "test"; console.log(myStr1,myStr2); //結果:test foo
var obj1 = {name : "ligang"}; var obj2 = obj1; var obj3 = {name : "ligang"}; console.log(obj1 === obj3); //falseobj1.age = 25; console.log(obj1 === obj2); //true console.log(obj1,obj2); //Object {name: "ligang", age: 25} Object {name: "ligang", age: 25}obj1 = {name : "lg"}; //obj1指向新對象,和obj2不再指向同一個對象 console.log(obj1,obj2); //Object {name: "lg"} Object {name: "ligang", age: 25}
var addConstructor = new Function('x' ,'y' ,'return x + y'); function addStatement(x, y){ return x + y; } var addExpression = function(x, y){ return x + y; };
(2)在全局作用域中使用this關鍵字:globalObj = this;
對象不包含某屬性時,JavaScript將在原型鏈中進行搜索。
var ary = ['foo','bar']; ary.join(); //原型鏈:Array.prototype ary.toLocalString(); //原型鏈:Object.prototype
var myFun = function(){} console.log(myFun.prototype); //firefox:Object {} chrome:myFun {} console.log(typeof myFun.prototype); //Object
Array.prototype.foo = 'foo'; var ary = []; ary.__proto__.foo; //結果:"foo"注意:__proto__不是官方ECMA標準的一部分;構造函數屬性可用于跟蹤從對象到它繼承的原型對象的鏈接!
示例:
Array.prototype.bar = 'bar'; var arr = new Array(); console.log(arr.constructor.prototype.bar); //結果:"bar" console.log(arr.bar); //結果:"bar" bar對象上沒有,從繼承的原型上獲取
var Foo = function Foo(){}; var FooInstance1 = new Foo(); console.log(FooInstance1.constructor); //結果:Foo() Foo.prototype = {}; var FooInstance2 = new Foo(); console.log(FooInstance2.constructor); //結果:Object()
var Bar = function Bar(){}; Bar.prototype = {constructor : Bar }; var BarInstance = new Bar(); console.log(BarInstance.constructor); //結果:Bar()
var MyFun = function myFun(){}; MyFun.prototype.x = 1; var o1 = new MyFun(); MyFun.prototype = { x : 2} var o2 = new MyFun(); console.log(o1.x); //結果:1 console.log(o2.x); //結果:2
Underscore.js:增強及擴展對象
Backbone.js:為復雜Javascript應用程序提供模型(models)、集合(collections)、視圖(views)的結構
轉載請寫明出處: http://blog.csdn.net/ligang2585116
一、JavaScript對象
1. JavaScript預包裝了9個原生對象構造函數:
Number()、String()、Boolean()、Object()、Array()、Function()、Date()、RegExp()、Error()注意:Math是一個靜態對象,它不是使用new運算符的構造函數。
2. 字面量語法與使用new操作符的效果相同。但是也有例外:Number()、String()、Boolean()
字符串、數字和布爾值使用字面量值時,只有在該值被視為對象的情況下才會創建實際的復雜對象。換句話說,在使用與構造函數有關的方法或者屬性之前,一直使用原始數據類型。在這種情況下,JavaScript會在為字面量創建一個包裝器對象,一邊將該值視為一個對象。調用方法結束后,JavaScript即拋棄包裝器對象,該值返回字面量類型。
3. 原始值:10、true、null、undefined、"123"
原始值的復制操作是真實值復制;比較操作采用值比較。示例:
var myStr1 = "foo"; var myStr2 = myStr1; var myStr3 = "foo"; console.log(myStr2 === myStr3); //結果:truemyStr1 = "test"; console.log(myStr1,myStr2); //結果:test foo
4. 復雜值:Object()、Array()、Function()、Date()、RegExp()、Error()
復雜值的復制操作是引用的復制,而不是實際值;比較操作采用引用比較。
示例1:var obj1 = {name : "ligang"}; var obj2 = obj1; var obj3 = {name : "ligang"}; console.log(obj1 === obj3); //falseobj1.age = 25; console.log(obj1 === obj2); //true console.log(obj1,obj2); //Object {name: "ligang", age: 25} Object {name: "ligang", age: 25}obj1 = {name : "lg"}; //obj1指向新對象,和obj2不再指向同一個對象 console.log(obj1,obj2); //Object {name: "lg"} Object {name: "ligang", age: 25}
二、Object()、Funcation()
1. 下面幾種方式不建議使用,了解可通過此種方式構造對象和函數即可!
(1) var obj1 = new Object('foo'); var obj2 = new Object(function(){});(2) var add = new Function('param1', 'param2', 'return param1 + param2'); var sub = new Function('param1, param2', 'return param1 - param2');2. 函數
函數的定義有三種不同的方式:構造函數、函數語句和函數表達式。var addConstructor = new Function('x' ,'y' ,'return x + y'); function addStatement(x, y){ return x + y; } var addExpression = function(x, y){ return x + y; };
3. 函數實參和形參的length
var myFun = function(x, y, z){console.log(myFun.length); //形參個數:3console.log(arguments.callee.length); //形參個數:3console.log(arguments.length); //實參個數:2 } myFun(1,2);三、 在web瀏覽器中引用head對象
(1)引用賦予head對象的名稱:globalObj = window;(2)在全局作用域中使用this關鍵字:globalObj = this;
四、JavaScript原型
對象的繼承,實際是繼承原型鏈!--JavScript原型(你不知道的JavaScript)對象不包含某屬性時,JavaScript將在原型鏈中進行搜索。
var ary = ['foo','bar']; ary.join(); //原型鏈:Array.prototype ary.toLocalString(); //原型鏈:Object.prototype
1. 默認的prototype屬性是Object()對象
示例:var myFun = function(){} console.log(myFun.prototype); //firefox:Object {} chrome:myFun {} console.log(typeof myFun.prototype); //Object
2. 原型是一個對象,原型鏈將每個實例都鏈接至其構造函數的prototype屬性。這意味任何使用new關鍵字(或原始值創建對象)創建對象時,它都會在“創建的對象實例”和“創建對象的構造函數”的prototype屬性之間添加一個隱藏的鏈接。該鏈接在實例中被稱為__proto__。
示例:Array.prototype.foo = 'foo'; var ary = []; ary.__proto__.foo; //結果:"foo"注意:__proto__不是官方ECMA標準的一部分;構造函數屬性可用于跟蹤從對象到它繼承的原型對象的鏈接!
示例:
Array.prototype.bar = 'bar'; var arr = new Array(); console.log(arr.constructor.prototype.bar); //結果:"bar" console.log(arr.bar); //結果:"bar" bar對象上沒有,從繼承的原型上獲取
3. 用新對象替換prototype屬性會刪除默認構造函數屬性
示例:var Foo = function Foo(){}; var FooInstance1 = new Foo(); console.log(FooInstance1.constructor); //結果:Foo() Foo.prototype = {}; var FooInstance2 = new Foo(); console.log(FooInstance2.constructor); //結果:Object()
如果想要替換JavaScript設置的默認prototype屬性,應重新連接引用該構造函數的構造函數屬性。
示例:var Bar = function Bar(){}; Bar.prototype = {constructor : Bar }; var BarInstance = new Bar(); console.log(BarInstance.constructor); //結果:Bar()
4. 用新對象替換prototype屬性不會更新以前的實例
示例:var MyFun = function myFun(){}; MyFun.prototype.x = 1; var o1 = new MyFun(); MyFun.prototype = { x : 2} var o2 = new MyFun(); console.log(o1.x); //結果:1 console.log(o2.x); //結果:2
Underscore.js:增強及擴展對象
Backbone.js:為復雜Javascript應用程序提供模型(models)、集合(collections)、視圖(views)的結構
轉載請寫明出處: http://blog.csdn.net/ligang2585116
總結
以上是生活随笔為你收集整理的JavaScript启示录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT基础架构规划方案二(计算机系统与机房
- 下一篇: 回溯法 -数据结构与算法