使用原型添加功能

时间:2014-06-16 12:32:58

标签: javascript prototype

在查看其他一些线程后,继承看起来有点复杂。为什么getAge()函数不返回选项1中的this._age值?选项1和选项2之间的最佳做法是什么?


选项1

function Person(){
    this._age = 21;
}

Person.prototype.getAge(){
    return this._age;//undefined
}

var person = new Person();
person.getAge();

选项2

function Person(){
    var _age = 21,
    getAge:function(){
        return _age;
    }
}

最后,上述两者之间会有什么不同?


var person = new Person();
person.age = 21;

我可能会让自己感到困惑。

3 个答案:

答案 0 :(得分:0)

试试这段代码:

var Person = function(){
    this._age = 21;
}

Person.prototype.getAge = function(){
    return this._age;
}

var person = new Person();
alert(person.getAge());

选项2:

var Person = function(){
    this._age = 21;
    this.getAge=function(){
        return this._age;
    }
}
var person = new Person();
alert(person.getAge());

答案 1 :(得分:0)

没有真正的“最佳实践”可言。第一个示例中的问题是一个简单的语法错误:

function Person(){
    this._age = 21;
}

Person.prototype.getAge = function(){
    return this._age; //21
}

var person = new Person();
person.getAge();

选项2也有很多语法错误。这里有太多详细内容。这是我所知道的这些概念的最佳解释:http://javascript.crockford.com/private.html

在选项1和第三个示例中,外部代码可以分别修改_ageage的值。也就是说,在选项1中,我可以一起去:

person._age = 1000;

这将实际更新对象中_age的值。对于您尝试使用选项2执行的操作,没有在Person“class”(实际上是Object)之外声明的函数可以修改_age的值,这可能是一件好事。上下文。

答案 2 :(得分:0)

继承很简​​单:

inheritance using underscore

或者你喜欢ExtJS

ExtJs inheritance behaviour