原型问题在javascript中

时间:2014-08-17 18:31:34

标签: javascript

我刚刚开始在javascript中学习原型,我无法理解代码中的问题。对不起,我的问题可能看起来很愚蠢

我收到这样的错误:   Uncaught TypeError: undefined is not a function

为什么未定义?我继承了用户的一个功能。 无法理解:(

var user = {

    sayName: function() {
        console.log(this.name)
    }

  };

user.name = "viktor";

user.sayName();

var user2 = {};

user2.prototype = user;

user2.name = "segey";

user2.sayName();

2 个答案:

答案 0 :(得分:2)

您需要使用普通对象设置原型链:

var user2 = Object.create(user); // set `user` as prototype of `user2`

user2.name = "segey";
user2.sayName();

答案 1 :(得分:1)

对于你的问题,正确的解决方案将是:

function User() {
    this.name = 'Viktor';
    return this;
}

User.prototype = Object.create({
    sayName: function() {
        return this.name;
    }
});

function User2() {}
User2.prototype = Object.create(User.prototype);

var user = new User();
user.sayName(); // 'Viktor'
user2 = new User2();
user2.name = 'Bogdan';
user2.sayName(); // 'Bogdan'

详细解释与例子。 假设我们有一些基本的课程Animal。我们的动物有agename

function Animal() {
    this.age = 5;
    this.name = "Stuffy";
    return this;
}

Animal.prototype = Object.create({
    getAge: function() {
        return this.age;
    },

    getName: function() {
        return this.name;
    }
});

当我花了一些时间在建筑上时,我明白我也需要SubClass of Animal。例如,让它为Dog类,具有新的属性和函数。此外,Dog必须扩展Animal类的函数和属性。

function Dog() {
    Animal.apply(this, arguments); // Call parent constructor
    this.wantsEat = true; // Add new properties
    return this;
}

Dog.prototype = Object.create(Animal.prototype); // Create object with Animal prototype
Object.extend(Dog.prototype, { // Any extend() function, wish you want
    constructor: Dog, // Restore constructor for Dog class
    eat: function() {
        this.wantsEat = false;
        return this;
    }
});

或者你可以使用Object.defineProperties()并以这种方式扩展:

Dog.prototype = Object.create(Animal.prototype, {
    constructor: {
        value: Dog
    },

    eat: {
        value: function() {
            this.wantsEat = false;
            return this;
        }
    }
});