Discuss / JavaScript / 如果想要创建的Student对象共享多个函数,可以将Student.prototype赋值为自定义对象

如果想要创建的Student对象共享多个函数,可以将Student.prototype赋值为自定义对象

Topic source

Hypnos1973

#1 Created at ... [Delete] [Delete and Lock User]
function Student(name) {
    this.name = name;
}

Student.prototype = {
    hello: function(){
        alert('Hello, ' + this.name + '!');
    },
   run: function(){
        alert(this.name + ' runnning ');
    },
   fly: function(){
           alert(this.name + ' flying ');
    }
};

xiaoming = new Student("xiaoming");
xiaoming.hello();
xiaoming.run();
xiaoming.fly();

RT,不知道有没有不妥的地方或者更好的方法

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你改变了原型链是不对的

直接绑定新函数就可以:

Student.prototype.hello = function () {...};

Hypnos1973

#3 Created at ... [Delete] [Delete and Lock User]

也就是说必须对每一个共享的函数必须进行形如下绑定吗?

Student.prototype.hello = function () {...};
Student.prototype.run = function () {...};
Student.prototype.fly = function () {...};

按照我的方法原型链是不是就变成了这样:

xiaoming ----> Student.prototype ----> 自己创建的匿名对象 ----> 自己创建的匿名对象.prototype ----> Object.prototype ----> null

凌毓

#4 Created at ... [Delete] [Delete and Lock User]

@Hypnos1973:

按照你的方法,原型链变成了:

xiaoming --> Student.prototype --> Object.prototype --> null

在chrome中验证一下:

xiaoming.__proto__===Student.prototype; //true 第一层原型链正确

Student.prototype.__proto__===Object.prototype;//true  为什么Student.prototype的原型是Object.prototype呢?

因为Student.prototype本身就是一个对象,你只不过创建了一个匿名对象覆盖掉了默认的Student.prototype。

在chrome中验证一下:

Student.prototype;

// Object {}
// fly :function {}
// hello :function {}
// run :function {}

上面的代码表明Student.prototype是Object对象,对象中包含fly、hello、run 方法。

并且按照《Javascript高级程序设计》第三版p155页讲到重写默认原型对象后,原型对象的constructor会由原来的构造函数变成Object构造函数,验证下对不对:

Student.prototype.constructor;

//function Object() {} 结果是Object构造函数

为什么呢?在《Javascript高级程序设计》6.2.3节自行寻找答案吧,这一节解决了我对原型链的很多困惑。


  • 1

Reply