js __proto__ prototype constructor

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
</body>
</html>

<script>
	function person(name){
		this.name  = name;
	}	

	person.prototype.getname = function(){
		return this.name;
	}

	var objectFactory = function(){
		var obj  = new Object();
		console.log(obj.__proto__);
		_construct = [].shift.call(arguments);

		//更改的是構造器的原型.  默認的是 function object / 更改後的指定的.	
		obj.__proto__ = _construct.prototype;
		var ret  = _construct.call(obj,arguments);

		return typeof ret  === 'object' ? ret  : obj;

	}

	var newObj  = objectFactory(person,"zhan");
	console.log(newObj.__proto__);
	//console.log(newObj.getname());
	// console.log(newObj);

	var a={name:'zhagn'};
	console.log(a);
	// 若是是這樣的調整,那麼a就變成一個函數對象,
	//a.__proto__  = person.__proto__;   // 這樣賦值是錯誤的.
	// a.__proto__ = person.constructor;  // 這樣賦值也是錯誤的,
	// 後改變原型對原始對象會有影響,不存在前後的問題.
	a.__proto__  = person.prototype;
	console.log(a);
	//console.log(a.getname());
	// new a;  //  a is not a constructor ,若是用new的方式, 必須有constructor屬性,
	// a();    //  a is not a function, 也不能夠調用, 
	// a.toString();  //Function.prototype.toString is not generic  
	//  a.name;   // 這個是能夠正常使用的,
	/*
	*  關鍵的區別 :   __proto__ : 是一個函數,
	*                 construct : 是一個函數,
	*				  prototype : 是一個對象. 建立對象,主要依賴於此.	
	*				  字面量對象不能夠 new 的關鍵緣由是  該對象不具備constructor屬性.	
	**/
	// 經過__proto__原型構造對象.
	//console.log(new a.__proto__.constructor('aaa'));
	var ar = new Array();
	var ob = new Object();
	console.log(ar.__proto__);   // 該__proto__中包括不一樣的方法.
	console.log(ob.__proto__);   // 

	console.log(ar.__proto__ != ob.__proto__,  ar.prototype == ob.prototype);

	console.log(a.prototype == newObj.prototype );
	console.log(a.__proto__ == newObj.__proto__);

</script>
相關文章
相關標籤/搜索