Javascript object.create и isPrototypeOf - PullRequest
2 голосов
/ 01 марта 2012
var Person = function(name, age){
    return Object.create(Object.prototype, {
        name: {
            value: name | "",
            writable: true,
            enumerable: true,
            configurable: true
        },
        age: {
            value: age | "",
            writable: true,
            enumerable: true,
            configurable: true
        }
    });
};

var Boy = function(name, age){
    return Object.create(Person(name, age), {
        gender: {
            value: "male"
        }
    });
};

var p = Person("John", 28);
var b = Boy();

console.log(p.isPrototypeOf(b)); // false?

Я пытаюсь понять object.create и как лучше его использовать, избегая использования конструкторов ключевое слово new.До сих пор я подходил к нему, как описано выше (хотя, вероятно, не лучшим образом, просто методом проб и ошибок) - и натолкнулся на то, что если я использую object.create, я больше не могу проверять instanceof и тип объекта.1006 * Кто-то предложил использовать isPrototypeOf для проверки - я делаю что-то неправильно, так как мой код выше возвращает false при проверке.

Кто-нибудь будет достаточно любезен, чтобы объяснить, где я иду неправильно?Я все еще новичок в наследовании прототипов в javascript.

1 Ответ

2 голосов
/ 01 марта 2012

Конечно, р не является прототипом б.

Это потому, что функция Person каждый раз возвращает новый объект.

Попробуйте следующее

var Boy = function(person, name, age){
    return Object.create(person, {
        gender: {
            value: "male"
        }
    });
};


var p = Person("John", 28);
var b = Boy(p);
assert(p.isPrototypeOf(b))
...