2017-04-21 65 views
2

我正在創建一個JavaScript庫,創建JavaScript對象。Javascript創建對象與新的和沒有新的+繼承

  1. 我該如何編寫庫的接口,以便他們的用戶可以創建這樣的對象WITH和WITHOUT? (我看到很多答案提出了構造函數,如果它們不是以新的方式被調用,而是以其他方式調用,則自動調用新的構造函數)。
  2. 我們可以在Object.create中使用new嗎?例如: let dog = new Object.create(animal);
  3. 如何提供繼承

要使用的代碼說明,你如何寫功能動物和狗的下方,下面的表達式是有效的:

let animal = new Animal(); // valid 
let animal = Animal(); // valid also, we should return the same object 
let dog = new Dog(); // valid, dog inherits/shares functions and properties from Animal. 
let dog = Dog(); // valid also, same case as in previous call. 

太謝謝你了。

+2

如果構造函數返回一個對象,'new'不會有任何效果。也許看看那個。 [**實施例**](https://jsfiddle.net/z3vqx9bx/1/)。 –

+0

[**本書**](http://shop.oreilly.com/product/9780596517748.do)的第3章可能會有所幫助。 –

+0

那麼我可以直接返回Object.Create嗎?它會工作(包括繼承)有沒有新的? – Dconversor

回答

2

我會做:

function Animal(name) { 
    if(!(this instanceof Animal)) { 
    return new Animal(name); 
    } 

    this.name = name; 
} 

Animal.prototype.walk = function() { console.log(this.name, 'is walking...'); }; 

function Dog(name) { 
    if(!(this instanceof Dog)) { 
    return new Dog(name); 
    } 

    this.name = name; 
} 

Dog.prototype = Object.create(Animal.prototype); 
Dog.prototype.constructor = Dog; 

var animal = Animal('John'); 
var other_animal = new Animal('Bob'); 

var dog = Dog('Blue'); 
var other_dog = new Dog('Brutus'); 

animal.walk(); // John is walking... 
other_animal.walk(); // Bob is walking... 

dog.walk(); // Blue is walking... 
other_dog.walk(); // Brutus is walking... 

console.log(dog instanceof Animal); // true 
console.log(dog instanceof Dog); // true 
+2

你必須在'Dog.prototype = Animal.prototype'後設置'Dog'的構造函數爲'Dog'。不要忘記放入一些分號。 –

+0

我的錯誤,謝謝:) – BabarConnect

+2

我想你設置'Animal.prototype.constructor'爲'狗',因爲你沒有克隆原型。 –