使用prototype属性定义方法,没有原型差异

时间:2014-01-13 13:04:22

标签: javascript function prototypejs

请澄清这两个代码的差异

function Person(gender) {
        this.gender = gender;
        alert('Person instantiated');
    }

    Person.prototype.sayHello = function()
    {
        alert ('hello');
    };

    var person1 = new Person('Male');
    var person2 = new Person('Female');
 // call the Person sayHello method.
    person1.sayHello()

,第二个是函数在函数内定义的函数(没有原型属性)

 function Animal(gender) {
        this.gender = gender;
        alert('animal instantiated');
        this.sayToodle =  function()
        {
            alert ('GOOOOOOO!!');
        };
    }



    var Animal1 = new Animal('Male');
    var Animal2 = new Animal('Female');


    Animal1.sayToodle();
my more simple question are:
  1. 有什么区别?
  2. 定义函数内部或外部的方法。有什么影响?
  3. 如果两者相同那么这是定义它的好方法。
  4. 原型做什么?
  5. 我们不能定义其函数的obj out方法(CLASS)???

2 个答案:

答案 0 :(得分:3)

在构造函数中定义一个成员(例如:this.name)只给出该对象的该实例访问该成员。

在原型中定义成员允许所有实例“共享”该属性。

一种帮助我理解这一点的方法是在原型中定义一个数组(或任何其他不是方法的成员),如下所示:

function Animal() {}

Animal.prototype = {
    kids: [],
    giveBirth: function() {
        for(var i = 0; i < arguments.length; i++) {
            this.kids.push(arguments[0]);
        }
    }
}

var cat = new Animal();
var giraffe = new Animal();

cat.giveBirth('kitten','another kitten','yet another kitten');

// cat.kids === ['kitten','another kitten','yet another kitten'];
// giraffe.kids === ['kitten','another kitten','yet another kitten'];

如果你注意到,长颈鹿的孩子们就像小猫一样。为什么是这样?因为在这种情况下,.giveBirth()会访问原型的 kids数组,该数组由所有实例共享。

如果我们不想分享会员,因为会员是独一无二的,该怎么办?你可以这样做:

function Animal() {
    this.kids = [];
}

Animal.prototype = {
    giveBirth: function() {
        for(var i = 0; i < arguments.length; i++) {
            this.kids.push(arguments[0]);
        }
    }
}

var cat = new Animal();
var giraffe = new Animal();

cat.giveBirth('kitten');

// cat.kids === ['kitten']
// giraffe.kids == undefined

giraffe.giveBirth('baby giraffe');

// cat.kids === ['kitten']
// giraffe.kids === ['baby giraffe']

正如您在评论中指出的那样,您决定如何定义属性的部分内容会影响内存使用情况;另一部分将介绍您希望在所有实例中“共享”的成员。

要更深入地了解原型(通过了解new如何工作),请参阅StackOverflow上的What is the 'new' keyword in JavaScript?

以下是引用:

  经过大量的搜索,我终于找到了确切的内容   新关键字确实如此,它有4件事:

     
      
  1. 它会创建一个新对象。这个对象的类型就是对象。
  2.   
  3. 它将此新对象的内部,不可访问,[[prototype]]属性设置为构造函数的外部,可访问,   原型对象。
  4.   
  5. 执行构造函数,只要提到这个就使用新创建的对象。
  6.   
  7. 它返回新创建的对象,除非构造函数返回非原始值。在这种情况下,那   将返回非原始值。
  8.   

答案 1 :(得分:0)

原型成员在实例之间共享,定义为this.something的构造函数中的成员是特定于实例的。

当实例需要特定于实例的成员(如Person.name)时,将其定义为this.name。当它可以共享时(如方法sayName)在原型上定义它,如:Person.prototype.sayName=function(){...

有关原型和构造函数的更多信息,您可以查看this answer