- newObject = create(oldObject);
- function F(){};
- F.prototype = oldObject;
- var newObject = new F();
- class Empolyee{
- String name;
- public Employee(String name){
- this.name = name;
- }
- public getName(){
- return this.name;
- }
- }
- class Coder extends Employee {
- String language;
- public Coder(name,language){
- super(name);
- this.language = language;
- }
- public getLanguage(){
- return this.language;
- }
- }
- function Empolyee(name){
- this.name = name;
- }
- function Empolyee(name){
- this.name = name;
- }
- var employee = {};
- Employee.call(employee,'Jack');
- function Empolyee(name){
- this.name = name;
- this.getName = function(){return this.name};
- }
- function Coder extends Employee(name,language){
- super(name);
- this.language = language;
- }
- var topObject = {
- __version__ : 1.0;
- };
- function Empolyee(name){
- this.name = name;
- this.getName = function(){return this.name};
- }
- var employee = {};
- employee.__proto__ = topObject;
- Employee.call(employee,'Jack');
- function Coder(name,language){
- this.name = name;
- this.language = this.language;
- this.getLanguage = function(){return this.language};
- }
- var coder = {};
- coder.__proto__ = employee;
- Coder.call(coder,'Coder Jack','Java');
- function sliceArguments(argumentsObj,n){
- var args = [];
- for(var i=0;i<argumentsObj.length;i++){
- if(i>=n){
- args.push(argumentsObj[i]);
- }
- }
- }
- function newInstance(prototype,constructor){
- var obj = {};
- obj.__proto__ = prototype;
- constructor.apply(obj,sliceArguments(arguments,2));
- }
- var employee = newInstance(topObject,Employee,'Jack');
- var coder = newInstance(employee,Coder,'Coder Jack','Java');
- function newInstance(constructor){
- var obj = {};
- obj.__proto__ = constructor.prototype;
- constructor.apply(obj,sliceArguments(arguments,1));
- return obj;
- }
- function Employee(name){
- this.name = name;
- this.getName = function(){return this.name};
- }
- var employee = newInstance(Empolyee,'Jack');
- var employee2 = newInstance(Empolyee,'Jack2');
- var employee3 = newInstance(Empolyee,'Jack3');
- function Coder(name,language){
- this.name = name;
- this.language = language;
- this.getLanguage = function(){return this.language};
- }
- Coder.prototype = newInstance(Empolyee,'');
- var coder = newInstance(Coder,'Coder Jack','Java');
- var coder2 = newInstance(Coder,'Coder Lee','C#');
- var coder3 = newInstance(Coder,'Coder Liu','C++');
- var coder4 = newInstance(Coder,'Coder Liu','JavaScript');
- function Employee(name){
- this.name = name;
- this.getName = function(){return this.name};
- }
- var employee = new Employee('Jack');
- function newInstance(constructor){
- var obj = {};
- obj.__proto__ = constructor.prototype;
- constructor.call(obj,sliceArguments(arguments,1));
- return obj;
- }
- {
- __proto__:Object.prototype,
- constructor: 指向函數本身
- }
- f.prototype.constructor=f
- function Employee(){};
- function Coder(){};
- Coder.prototype = new Employee();
- Coder.prototype.constructor = Coder;
- var coder = new Coder();
- coder instanceOf Coder//true
- Coder.prototype.isPrototypeOf(coder)//true
- <script>
- function Employee(name){
- this.name = name;
- //this.getName = function(){return this.name};方法代碼應該放到原型對象之中,而不是初始化函數中,這樣每個employee對象都共享同一個方法代碼
- }
- Employee.prototype.getName = function(){return this.name};
- var employee = new Employee('Jack');
- console.log("employee.getName(): " + employee.getName());//Jack
- var employee2 = new Employee('Jack2');
- console.log("employee2.getName(): " + employee2.getName());//Jack2
- function Coder(name,language){
- this.name = name;
- this.language = language;
- //this.getLanguage = function(){return this.language}; 方法代碼應該放到原型對象之中,而不是初始化函數中,這樣才能實現代碼共享
- }
- Coder.prototype = new Employee('');
- Coder.prototype.constructor = Coder;//這一句話其實也可以不寫,不影響繼承
- Coder.prototype.getLanguage = function(){return this.language};
- var coder = new Coder('Coder Jack','Java');
- console.log("coder.getName(): " + coder.getName());//Coder Jack
- console.log("coder.getLanguage(): "+coder.getLanguage());//Java
- var coder2 = new Coder('Coder Lee','C#');
- console.log("coder2.getName(): " + coder2.getName());//Coder Lee
- console.log("coder2.getLanguage(): " + coder2.getLanguage());//C#
- var coder3 = new Coder('Coder Liu','C++');
- console.log("coder3.getLanguage(): " + coder3.getName());//Coder Liu
- console.log("coder3.getLanguage()" + coder3.getLanguage());//C++
- console.log("employee.constructor: " + employee.constructor);
- console.log("employee.constructor.prototype === Employee.prototype: " + (employee.constructor.prototype === Employee.prototype));
- console.log("employee.constructor.prototype.constructor === Employee: " + (employee.constructor.prototype.constructor === Employee));
- console.log("employee instanceof Object: " + (employee instanceof Object));
- console.log("employee instanceof Function: " + (employee instanceof Function));
- console.log("employee instanceof Employee: " + (employee instanceof Employee ));
- console.log("Employee.prototype.isPrototypeOf(employee): " + (Employee.prototype.isPrototypeOf(employee)));
- console.log("Function.prototype.isPrototypeOf(employee): " + (Function.prototype.isPrototypeOf(employee)));
- console.log("Object.prototype.isPrototypeOf(employee): " + (Object.prototype.isPrototypeOf(employee)));
- console.log("coder.constructor: " + coder.constructor);
- console.log("coder instanceof Object: " + (coder instanceof Object));
- console.log("coder instanceof Function: " + (coder instanceof Function));
- console.log("coder instanceof Employee: " + (coder instanceof Employee ));
- console.log("coder instanceof Coder: " + (coder instanceof Coder ));
- console.log("Employee.prototype.isPrototypeOf(coder): " + (Employee.prototype.isPrototypeOf(coder)));
- console.log("Coder.prototype.isPrototypeOf(coder): " + (Coder.prototype.isPrototypeOf(coder)));
- console.log("Function.prototype.isPrototypeOf(coder): " + (Function.prototype.isPrototypeOf(coder)));
- console.log("Object.prototype.isPrototypeOf(coder): " + (Object.prototype.isPrototypeOf(coder)));
- </script>
- if (typeof Object.create !== 'function') {
- Object.create = function (o) {
- function F() {}
- F.prototype = o;
- return new F();
- };
- }
- var newObject = Object.create(oldObject);
- <script>
- /**
- * 以原型對象爲模板創建出新對象
- * 這個函數已經被Chrome和IE9採用,所以需要有個判斷這個函數是否已經存在,Crockford的影響力可見一斑
- */
- if(!Object.create){
- Object.create = function(oldObject){
- function F(){};
- F.prototype = oldObject;
- return new F();
- }
- }
- /**
- * 在構造函數的原型對象上添加方法
- * 非常推薦這個函數,因爲這個函數能夠培養出在原型對象中定義方法的良好習慣
- */
- Function.prototype.method = function(name,func){
- if(!this.prototype[name]){
- this.prototype[name] = func;
- return this;
- }
- };
- /**
- * 使構造函數“繼承”其他構造函數
- * 實際上是將構造函數的原型對象替換爲另外構造函數產生的對象
- *
- */
- Function.method('inherits',function(F){
- this.prototype = new F();
- return this;
- });
- /*****************************************
- *使用鏈式代碼清晰緊湊地定義構造函數
- *****************************************/
- var Employee = function(name){
- this.name = name;
- }.method('getName',function(){
- return this.name;
- });
- //由於method和inherits函數都返回this,所以可以非常舒服地將構造函數寫成鏈式代碼
- var employee = new Employee("jack");
- alert(employee.getName());
- //由於method和inherits函數都返回this,所以可以非常舒服地將構造函數寫成鏈式代碼
- var Coder = function(name,language){
- this.name = name;
- this.language = language;
- }.inherits(Employee)
- .method('getLanguage',function(){
- return this.language;
- })
- .method('getIntroduction',function(){
- return this.name + " is skilled in " + this.language;
- });
- var coder = new Coder('Jack','Java');
- alert(coder.getIntroduction());
- alert(coder.getName());
- </script>
- /*****************************************
- * 模擬私有變量
- *****************************************/
- var Employee = function(name){
- //私有變量
- var name = name;
- this.getName = function(){return name};
- };
- var employee = new Employee('Jack');
- alert(employee.name);//undefined
- alert(employee.getName());//Jack
- /******************
- *模擬super.method()
- ******************/
- var Coder = function(name,language){
- var employee = new Employee('');
- //父類的getName方法
- var superGetName = employee.getName;
- this.name = name;
- this.language = language;
- this.getName = function(){
- return "my name is :" + superGetName.call(this,name);
- };
- }.inherits(Employee)
- .method('getLanguage',function(){
- return this.language;
- })
- .method('getIntroduction',function(){
- return this.name + " is skilled in " + this.language;
- });
- var coder = new Coder('Jack','Java');
- alert(coder.getIntroduction());
- alert(coder.getName());//my name is Jack
- <script>
- /**
- * 以原型對象爲模板創建出新對象
- */
- if(!Object.create){
- Object.create = function(oldObject){
- function F(){};
- F.prototype = oldObject;
- return new F();
- }
- }
- /*****************************************
- * 使用原型對象創建對象,創建之後再對象初始化,
- * 這種創建方式直白地顯示了原型語言創建對象的特點
- *****************************************/
- var employee = {
- name: 'Jack',
- getName: function(){return this.name;}
- };
- var coder = Object.create(employee);
- coder.name = 'Jackson';
- coder.language = 'language';
- coder.getLanguage = 'Java';
- coder.getIntroduction = function(){
- return this.name + " is skilled in " + this.language;
- }
- alert(coder.getName());
- alert(coder.getIntroduction());
- </script>
- <script>
- /**
- * 以原型對象爲模板創建出新對象
- * 這個函數已經被Chrome和IE9採用,所以需要有個判斷這個函數是否已經存在,Crockford的影響力可見一斑
- */
- if(!Object.create){
- Object.create = function(oldObject){
- function F(){};
- F.prototype = oldObject;
- return new F();
- }
- }
- /**
- * 在構造函數的原型對象上添加方法
- * 非常推薦這個函數,因爲這個函數能夠培養出在原型對象中定義方法的良好習慣
- */
- Function.prototype.method = function(name,func){
- if(!this.prototype[name]){
- this.prototype[name] = func;
- return this;
- }
- };
- /**
- * 使構造函數“繼承”其他構造函數
- * 實際上是將構造函數的原型對象替換爲另外構造函數產生的對象
- *
- */
- Function.method('inherits',function(F){
- this.prototype = new F();
- return this;
- });
- /**
- * 創建父對象方法的副本
- */
- Object.method('superior',function(methodName){
- var that = this;
- var method = this[methodName];
- return function(){
- return method.apply(that,arguments);
- };
- });
- /*****************************************
- * 使用函數創建對象
- * 1 使用函數的閉包實現私有屬性
- * 2 子對象可以調用父對象的方法
- *****************************************/
- function employee(name){
- var object = {};
- //name屬性是私有變量
- var name = name;
- //定義一個getName私有變量的目的是,如果其他方法想調用getName方法,它們可以直接調用getName而不是object.getName。
- //如果該object.getName被外部篡改了,那麼其他引用var getName的方法並不會收到影響,這樣程序的健壯性有保證
- var getName = function(){
- return name;
- }
- //getName對外公開
- object.getName = getName;
- return object;
- }
- function coder(name,language){
- var object = employee(name);
- //獲取父對象getName函數的副本
- var superGetName = object.superior('getName');
- var language = language;
- var getLanguage = function(){return language;};
- //調用父對象的方法
- var getName = function(){
- return "my name is " + superGetName(name);
- };
- object.getName = getName;
- return object;
- }
- var e1 = employee('Jack');
- alert(e1.name);//undefined
- alert(e1.getName());//Jack
- var c1 = coder('Jackson','Java');
- alert(c1.getName());//My name is Jack
- </script>