2014-10-10 5 views
1

Давайте предположим, что у меня есть следующие функции объекта:Как расширить существующую функцию конструктора в javascript?

function A(options){ 
... 
} 

Тогда я хочу, чтобы создать новую функцию (B), который наследует прототип в. Таковы условия Я ищу:

  • прототип Б, в случае изменения не должны изменять-х
  • при вызове к функции B, как конструктор, конструктор должен быть вызван с соответствующими опциями.

B должен выглядеть следующим образом:

функция B (aOptions, bOptions) {...}

var b = new B({}, {}) 
+0

Javascript [не имеет] (http://www.crockford.com/javascript/inheritance.html) классический механизм наследования. – amphetamachine

+0

Ответы на многие вопросы JS можно найти на MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript#Inheritance –

+0

Не было бы необходимости в двух вариантах. Вы можете передать один и использовать или использовать функции, применимые к этой конкретной функции. Подробнее о прототипе и передайте аргументы в цепочку функций здесь: http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR

ответ

7

Просто позвоните A конструктор с this

function B(aOptions, bOptions) { 
    A.call(this, aOptions); 

    // do stuff with bOptions here... 
} 

установка прототипа

B.prototype = Object.create(A.prototype, { 
    constructor: { 
    value: B 
    } 
}); 

Теперь B будет иметь методы прототипа из А.

Любые новые методы, добавленные в прототип Б будет не быть доступны Прототип в


Там есть пара другие твики, которые могут сделать вашу жизнь проще.

function A(options) { 

    // make `new` optional 
    if (!(this instanceof A)) { 
    return new A(options); 
    } 

    // do stuff with options here... 
} 

И сделать то же самое для B

function B(aOptions, bOptions) { 

    // make `new` optional 
    if (!(this instanceof B)) { 
    return new B(aOptions, bOptions); 
    } 

    // call parent constructor 
    A.call(this, aOptions); 

    // do stuff with bOptions here... 
} 

Теперь вы можете позвонить A(options) или new A(options), чтобы получить тот же результат.

То же самое с B, B(aOptions, bOptions) или new B(aOptions, bOptions) получит тот же результат.

+0

, так что будет значение этого в functon b ?? .. Предположим, если я вызываю функцию b с var a = new a() .. будет ли эта точка a или несколько иначе? –

+0

@AvinashBabu здесь весь код не вносит изменений в A. 'new A()' вызывает 'A', а не' B'. Значение 'this' будет указывать на экземпляр' B', когда вы вызываете 'new B()'. – naomik

+0

поэтому, если я вызываю var b = new b(), то это указывает на переменную b вправо ?? –

Смежные вопросы