對象及原型

創建對象

字面量 創建對象

var obj ={
	key:value
}

new Object() 創建對象

var obj1 = new Object()

獲取、設置對象屬性

obj.key 獲取/設置obj的key屬性的值value

obj1.key / obj1.key=value

obj[‘key’] 獲取/設置obj的key屬性的值value

obj['key'] / obj['key']=value

key in obj 判斷obj中是否有屬性key

key in obj

delete obj.key 刪除obj的key屬性

delete obj.key

批量創建對象方法

工廠模式

//優點  生成獨立的新對象
//缺點  代碼重複  沒有從屬性
function fun(value1, value2){
	var obj ={
		'key1':value1,
		'key2':value2
	}
	return obj
}
var a = fun(實參1, 實參2)

//原型模式 函數的原型對象 prototype屬性

//優點  生成一個對象  沒有重複  有從屬
//缺點  可變的不可變
fun.prototype={
	key1:value1,
	key2:value2
}

構造函數

//首字母大寫
//優點  創建不同對象  有從屬關係
//缺點  代碼重複
function App(value1, value2){
	this.key1=valve1,
	this.key2=value2
}
var app = new App(實參1, 實參2)

構造+原型 組合模式

//不重複  可改變  有從屬
function App(value1, value2){  //可變
	this.key1=valve1,
	this.key2=value2
}
App.prototype={  //不可變
	key3:function(){},
	key4:value4
}
var app = new App(實參1, 實參2)

全局函數調用

function a(){  }
a() 或  window.a()

this指向

純粹函數中的this        指向window
對象中的函數的this      指向上層對象
事件中的this            指向事件觸發元素
構造函數中的this        指向實例化的對象

//改變this指向的方法
call(obj, 參數1, 參數2) //","隔開
apply(obj, [參數1, 參數2]) //"[]"包裹
bind(obj, 參數1, 參數2)() 或 bind(obj)(參數1, 參數2) //","隔開    參數寫在前/後"()"中  需要調用

原型

每一個普通函數都有一個prototype屬性,它指向函數的原型對象
原型對象有一個constructor屬性,指向它的構造函數

原型鏈

每一個obj中都有`__proto__`屬性,指向構造函數的原型對象,層層遞進,最終指向null,這樣形成的鏈式結構叫原型鏈

new操作符的實現

function fun(){
	this.key = value;
}
fun.prototype.btn = function(){}
var obj = {} //定義一個新對象
`obj.__proto__` = fun.prototype //函數的原型對象賦到obj的原型鏈上
fun.call(obj) //改變this指向到obj
var ol = obj //返回新對象

面向過程

需要關注每一步

面向對象編程(oop)

以對象的方式實現某個功能
優點:不需要關注如何實現,只關注如何使用
//案例1
<body>
		<div id="box"></div>
	</body>
	<script type="text/javascript">
		function Box(){
			this.div=document.createElement('div')
		}
        Box.prototype={
        	innerText:function(texts){
        		this.div.innerText=texts
        		return this
        	},
        	innerCss:function(obj){
        		for (var key in obj){
        			this.div.style[key]=obj[key]
        		}
        		return this
        	},
        	innerHtml:function(id){
        		var d = document.getElementById(id)
        		d.appendChild(this.div)
        		return this
        	}
        }
        var ass = new Box()
        ass.innerText('aaa').innerCss({'background':'red'}).innerHtml('box')
	</script>

面向對象

//特性:封裝、繼承、多態

原型鏈繼承

//子類.prototype = new 父類
//優點:繼承父類所有的方法和屬性
//缺點:無法給父類構造函數傳參
//父類
function Fu(value){
	this.keys = value
}
Fu.prototype.fun=function(a){console.log(a)}
//子類
function Zi(){}
Zi.prototype=new Fu('value')
//實例化Zi()
var zi = new Zi()
console.log(zi)

構造函數繼承

//子類構造函數中 {父類.call(this)}
//優點:可以給父類構造函數傳參
//缺點:不能繼承父類的原型
//父類
function Fu(value1,value2){
	this.keys1 = value1,
	this.keys2 = value2
}
Fu.prototype.fun=function(a){console.log(a)}
//子類
function Zi(){Fu.call(this)}
//實例化Zi()
var zi = new Zi()
console.log(zi)

組合繼承

//優點:即可給父類傳參,也可繼承父類的原型
//父類
function Fu(value1,value2){
	this.keys1 = value1,
	this.keys2 = value2
}
Fu.prototype.fun=function(a){console.log(a)}
//子類
function Zi(n,m){Fu.call(this,n,m)}
Zi.prototype=new Fu('value1','value2')
//實例化Zi()
var zi = new Zi('value3','value4')
console.log(zi)

多態

//父類
function Fu(value1,value2){
	this.keys1 = value1,
	this.keys2 = value2
}
Fu.prototype.fun=function(a){console.log(a)}
//子類
function Zi(n,m,c){
	Fu.call(this,n,m)
	this.c=c
}
Zi.prototype=new Fu('value1','value2')
Zi.prototype.dd='qwe'
//實例化Zi()
var zi = new Zi('value3','value4','sdf')
console.log(zi)

閉包

//即  閉包函數 閉包變量
//可以訪問其他函數內部變量的函數
//即  定義在函數內部的函數
//---------------------------------------------------------
//方法一
function a(){
	var x=1
	//x 閉包變量 不會銷燬,可能造成內存泄漏
	//b() 閉包函數
	function b(){
		console.log(x)
	}
	b()
}
a()
//-----------------------------------------------------
//方法二
function a(){
	var x=1
	//x 閉包變量 不會銷燬,可能造成內存泄漏
	(function(){
		console.log(x)
	})()
}
a()
//-----------------------------------------------------
//方法三
function a(){
	var x=1
	//x 閉包變量 不會銷燬,可能造成內存泄漏
	return function(){
		console.log(x)
	}
}
a()()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章