<!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>