为什么要设置Javascript对象prototype的constructor

最近读了一篇关于Javascript面向对象编程的文章,里面介绍了Javascript中的类,对象,属性,方法,构造函数,继承,封装,抽象和多态性。读完之后感觉受益匪浅,对Javascript有了进一步的认识。文章的地址在这里

在讲到继承的时候,文章里面用了如下的例子

// define the Person Class
function Person() {}

Person.prototype.walk = function(){
  alert (‘I am walking!‘);
};
Person.prototype.sayHello = function(){
  alert (‘hello‘);
};

// define the Student class
function Student() {
  // Call the parent constructor
  Person.call(this);
};

// inherit Person
Student.prototype = new Person();

// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

// replace the sayHello method
Student.prototype.sayHello = function(){
  alert(‘hi, I am a student‘);
};

// add sayGoodBye method
Student.prototype.sayGoodBye = function(){
  alert(‘goodBye‘);
};

var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();

// check inheritance
alert(student1 instanceof Person); // true
alert(student1 instanceof Student); // true

里面的这行代码,让我困惑了:

// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

因为加不加这行代码,最后的运行结果都不受到影响,所以不理解加上去有什么作用。网上搜索了一下,在Stack Overflow网站中找到了一个类似的提问

原文地址如下

http://stackoverflow.com/questions/8453887/why-is-it-necessary-to-set-the-prototype-constructor

提问者问到那行代码是否有特殊作用,是否可以省略?回答者给出了下面的例子作解答:

// define the Person Class
function Person(name) {
    this.name = name;
}  

Person.prototype.copy = function() {
    // return new Person(this.name); // just as bad
    return new this.constructor(this.name);
};  

// define the Student class
function Student(name) {
    this.name = name;
}  

// inherit Person
Student.prototype = new Person();  

var student1 = new Student("trinth");
console.log(student1.copy() instanceof Student); // => false

这个例子中,省去了那行设置prototype中constructor的代码,可以看到最后一行student1.copy() instanceof Student得到的结果是false,并不是我们想要的。加上那行代码之后,student1.copy() instanceof Student得到的结果是true,这个才是我们想要的。

所以,设置子类中prototype的constructor还是有必要的。

为什么要设置Javascript对象prototype的constructor

时间: 2024-10-10 11:37:35

为什么要设置Javascript对象prototype的constructor的相关文章

JavaScript对象中的constructor属性

constructor属性始终指向创建当前对象的构造函数. 比如下面的例子: 1 // 等价于 var foo = new Array(1, 56, 34, 12); 2 var arr = [1, 56, 34, 12]; 3 console.log(arr.constructor === Array); // true 4 // 等价于 var foo = new Function(); 5 var Foo = function() { }; 6 console.log(Foo.constr

15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图: 相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称之

javascript--15条规则解析JavaScript对象布局(__proto__、prototype、constructor)

大家都说JavaScript的属性多,记不过来,各种结构复杂不易了解.确实JS是一门入门快提高难的语言,但是也有其他办法可以辅助记忆.下面就来讨论一下JS的一大难点-对象布局,究竟设计JS这门语言的人当时是怎么做的?设计完之后又变成了什么? 我们来看一张图:  相信大家对这张图都不陌生了,构造函数有一个prototype属性指向其原型.相反原型也有一个constructor指向构造函数.与此同时实例也有一个constructor指向构造函数,这简直就是互相捆绑生怕找不到啊不是吗? 还有一个我们称

JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)

面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步骤解决问题 优点:性能比面向对象高,适合跟硬件联系很紧密的东西 缺点:没有面向对象那么容易维护,复用,扩展 面向对象编程: 把事务分解成一个个对象,然后由对象之间分工与合作,分工明确,每一个对象都是功能中心 面向对象特性:封装性.继承性 .多态性 封装性:将一个功能封装起来,小封装 将多个函数封装起来,整体封装起来形成一个

对于JavaScript对象的prototype和__proto__的理解

一.Object和Function的关系: 刚学JavaScript的时候,看书上说JavaScript中万物皆对象,而javascript中的其他对象都是从Object继承而来,包括内置对象.瞬间觉得Object碉堡了! 后来,又认识了Function,才知道原来Function才是隐藏在幕后的大BOSS,Object只不过是个大师兄. Object和Function都是JS自带的函数对象,Function比较牛逼点,因为它是Object的构造函数,而且Object的__proto__属性指向

Javascript对象的prototype

转帖: http://www.alloyteam.com/2015/10/prototype/?hmsr=toutiao.io&bsh_bid=928776428 最近恰好有人问起关于 javascript 中的 prototype 相关的问题.特此简单地整理了一下,比较基础,希望能让有类型问题的同学,可以用这篇文章提供参考. prototype 是通过调用构造函数而创建的对象实例的原型对象. 每一个新的函数,都会拥有一个 prototype 属性,这个属性指向函数的原型对象. 所有原型对象都有

JavaScript之prototype对象

简述prototype: 在js中,每个构造函数都有一个原型属性prototype,因为这个属性的值通常是一个对象,又叫原型对象!你不需要显式的去定义原型对象,因为每个构造函数都会一个原型属性,通常在这个原型对象中,会包含一个constructor属性指向该原型对象的构造函数: function a() {     alert('hello'); } var b = new a(); console.log(b.constructor);//返回函数a的字面量function a() {aler

javascript对象constructor属性

概述 返回一个指向创建了该对象原型的函数引用.需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串.对于原始值(如1,true 或 "test"),该属性为只读. 描述 所有对象都会从它的原型上继承一个 constructor 属性: var o = new Object // 或者 o = {} o.constructor == Object var a = new Array // 或者 a = [] a.constructor == Array var n =

js高级构造函数,实例对象和原型对象——prototype、__proto__和constructor构造器

一.前言 了解JavaScript面向对象,需要先了解三个名词: 构造函数,实例对象和原型对象. 注意:JavaScript中没有类(class)的概念,取而代之的是构造函数,两者类似却又有很大的差别. 先上代码,最常用的: function Person(name, age) { this.name = name; this.age = age; this.eat= function() { alert('吃西红柿') } } var person1 = new Person('小米', 28