不使用原型链和返回对象的优点/缺点

时间:2014-06-14 02:45:44

标签: javascript prototypal-inheritance

我开始理解javascript,但使用javascript对象有什么好处......

var Person(name, age) {
    var obj = {
        species: "Homo sapien",
        location: "Earth"
    };
    obj.name = name;
    obj.age = age;
    return obj;
}

var Mike = Person("Mike", 17); // => { ... name: "Mike", age: 17}

与标准

相比
var personProtoype = {
    name: "anon",
    age: 0,
    species: "Homo sapien",
    location: "Earth"
}

var Person = function(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype = personPrototype;

var Mike = new Person("Mike", 17);

因为它似乎使用更少的代码并且更容易实现和理解。使用第一种方法,“继承”也非常简单。

var Student(name, age, major) {
    var obj = Person(name, age); // => { ... name: name, age: age}
    obj.major = major;           // => { ... name: name, age: age, major: major}
    return obj;
}

据我所知,以下内容根本不使用原型链,只是简单地构造对象的函数。我只是想知道以这种方式做事有什么好处吗?也许是为了让对象不回顾一大堆原型? (如果需要这种行为)

1 个答案:

答案 0 :(得分:0)

我想不出除了你列出的那些之外的任何优点,尽管可能有一些。以下是一些缺点:

  1. 没有instanceof测试。在您的问题中使用Person实现,稍加重命名:

    var Mike1 = Person_no_prototype("Mike", 17);
    var Mike2 = new Person_with_prototype("Mike", 17);
    console.log(Mike1 instanceof Person_no_prototype);    // false
    console.log(Mike2 instanceof Person_with_prototype);  // true
    
  2. 当存在方法时,使用更多内存。考虑greet方法的实现,放在objPerson.prototype上:

    /* obj or Person.prototype */.greet = function greet() {
        alert("Hi there, " + this.name + "!");
    };
    

    使用原型,greet函数只创建一次。如果没有原型,您每次都会创建一个新函数,其中包含任何开销。