给构造函数添加了新的方法,在实例中为什么不能调用
发布于 8 年前 作者 muyoucun557 5662 次浏览 来自 问答

代码如下: function Student(name){ this.name = name; } Student.sayHi = function(){ //将sayHi方法直接捆绑在Student上 console.log("Hi , I am "+this.name); } var stu = new Student(); stu.sayHi();

在浏览器中执行上述代码会报错,这是为什么?

11 回复

sayHi 方法在 stu 实例中不存在,顺着原型链往上找, Student.prototype 也没有。 你可以这样写

Student.prototype.sayHi = function () {
  console.log('Hi , I am ' + this.name);
}

要么在构造函数里声明方法,要么在构造函数原型链上声明方法。

  1. 构造函数声明
function Student(name){
	this.name = name;
	this.sayHi = function(){
	};
}
  1. 原型链
Student.prototype.sayHi = function(){
};

Student又不是对象怎么能直接添加方法?

@modood sayHi方法已经绑定在Student中,通过Student构造函数构造出来的实例stu中为什么没有sayHi方法?

@zhangjh 回复1.Student是函数,也是对象。 回复2.像问题中的代码一样,给Student函数添加sayHi方法,为什么实例化出来的stu中不包含sayHi方法。 回复3.这个问题会不会和关键字new有关系?

你要说函数也是对象当然没毛病,js中一切都是对象。 你这里Student通过new调用已经不是单纯的函数了,而是对象的构造函数。 你通过new调用的话,会生成一个新对象,该新对象只有你在构造函数里声明的属性,以及你在原型链上声明的方法。 这个sayHi方法当然还是在Student上的,你可以通过Student.sayHi()调用看一下,但实例上是不会有这个方法的,你只是给Student添加了该方法。 如果要想给实例都添加上这个方法,只能通过我说的那两个方法。

sayHi是不能通过实例化对象调用的,

这是静态方法呀。 Array.from,Array.isArray之类的

经过多方学习,弄清楚了什么原因了。 1.声明一个函数,只有再用new关键字进行标注(在new一个实例时)时,该函数才被称为构造函数(或者说具有了构造函数的功能——也就是创建实例的功能)。 2.在构造函数中,this指向的是一个实例。 3.构造函数的返回值: 3.1:构造函数没有return语句,构造函数返回的就是this 3.2:构造函数有return语句。 3.2.1:return的是复杂类型的数据(如array、object…)那么这个构造函数的返回值由return语句决定 3.2.2:return的是简单类型的数据(如数字、boolean…)那么构造函数的返回的是this 4.在代码中,sayHi方法并未赋值给this,因此Student的实例不能访问sayHi方法

回到顶部