原型和继承 constructor、prototype、__proto__

之前大神说,学习 JS 遇到原型和继承果断的跳过吧,没有它们,你也可以把 JS 玩的很 6

突然入了坑,简单的记录一下

构造函数

实例对象

  用来初始化新创建的对象的函数是构造函数。

  在 C++ 语言中,类 有一个构造函数, 它与类同名且没有返回值的(可以不写,也可重载多个);

  在 JS  中, 没有 类 的概念,原型对象 姑且等同于 类 ,原型对象有 constructor 属性,该属性指向原型对象的构造函数。 JS 中默认存在的一些原型对象,也存在它们的构造函数,比如 Object() Array() Function() String()  Number()  Boolean() 等。

  通过构造函数可以实例化多个对象,它们称为实例对象,且他们拥有相同的原型对象。 可以通过原型对象来实现 继承。   

prototype

  构造函数有 prototype 属性, 指向实例对象的原型对象。 同一构造函数实例化的不同实例对象指向相同的原型对象。 在 prototype 下定义的方法 有点像 C++ 里的在 类

constructor

  原型对象有 constructor 属性,指向该原型对象的构造函数。

  由于实例继承自原型对象,所以也拥有 constructor 属性, 指向原型对象的构造函数。

  一句话,他们的指向完全相同

  

__proto__

  实例对象有 __protp__ 属性,指向该实例对象对应的原型对象。 也可以理解为 父级对象 吧

  构造函数也有 __proto__ 属性。constructor 下的 __proto__ 是指向 Function() 的,说到底构造函数也是一个稍特殊的函数(比普通函数多一个 prototype)

举个栗子:

        constructor、prototype、__ptoto__

(3)[1,2,3] 是一个长度为 3 的数组,也是一个实例对象

1 这个实例对象对应的原型对象(__protp__)是 Array(0)

2 这个原型对象有 constructor 属性,指向该原型对象的构造函数 f Array()    1、f  代表是个函数 ;2、Array()   构造函数。 实例对象因为继承也拥有 constructor 属性。  

3 这个构造函数有 prototype 属性,指向实例对象对应的原型对象,也就是 Array(0) 

4 综合 1 3 可得:实例对象对应的原型对象 === 实例对象对应的原型对象的构造函数的原型对象,hiahiahia.....  这么一来,在原型对象的 constructor 属性下的 prototype 属性下会看到无限的自我循环。 prototype 属性 指向的原型对象有 constructor 属性, constructor 属性指向的构造函数 有 prototype 属性, prototype 属性指向的原型对象有 constructor 属性......

var arr = new Array();
console.log(Array.prototype.constructor === Array); // true  原型对象的 constructor 属性指向
console.log(arr.constructor === Array);        // true  实例对象的 constructor 属性指向

这么说吧:

constructor 指向的是构造函数

prototype 和 __protp__ 指向的都是原型对象。前者指向自己,后者指向父级。

绕口令一般的..........

希望不是误导..........

原文地址:https://www.cnblogs.com/yier0705/p/8203284.html

时间: 2024-10-25 15:18:30

原型和继承 constructor、prototype、__proto__的相关文章

JS面向对象,原型,继承

ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.var box = new Object();box.name = 'Lee';box.age = 100;box.run = function(){ return this.name + this.age + '运行中...'; //th

JS原型和继承

//Js所有的函数都有一个prototype属性 function aa() { } console.info(aa.prototype); //这个prototype属性引用了一个对象,即原型,初始化时是一个空对象,也就是没有一个成员(即原型属性和原型方法). var i = 0; for (i in aa.prototype) { console.info(i); i++; } alert("member: " + i);//alert出原型所有属性和方法个数. 0个属性和方法 f

详解JavaScript中的原型和继承-转自颜海镜大大

本文将会介绍面向对象,继承,原型等相关知识,涉及的知识点如下: 面向对象与继承 CEOC OLOO 臃肿的对象 原型与原型链 修改原型的方式 面向对象与继承 最近学习了下python,还写了篇博文<重拾编程乐趣——我的Python笔记>,加深了我对面向对象的一些理解. 我们会对我们写的程序进行抽象,而不同的语言都提供了不同的抽象工具,比如各种语言里面的数组,集合(键值数组,哈希表,字典等)等提供了对数据的抽象:而VB里面的子程序,类C语言里面的函数,提供了抽象代码段的能力. 有时我们希望将数据

原型链继承中的prototype、__proto__和constructor的关系

前不久写了有关原型链中prototype.__proto__和constructor的关系的理解,这篇文章说说在原型链继承中的prototype.__proto__和constructor的关系. 通过以下最简单的原型链继承(省略了属性和方法)来讨论: 1 function SuperType(){}; 2 function SubType(){}; //继承了SuperType 3 SubType.protoType = new SuperType(); //创建了一个SubType的实例 4

Object.prototype.__proto__ 、Object.prototype和 Object.prototype.constructor

Object.prototype.__proto__: 实体对象指向造它的构造函数的 prototype属性所指 的对象 ,实例的__proto__是引用构造函数的prototype属性所指对象, Object.prototype : js规定,构造函数有prototype 属性,指向一个对象,这个对象一般就是构造函数的公有成员. 所以 __proto__  和 prototype 可以指向同一个对象  {key1:value1,key2:value2,......},构造函数的私有和特权函数会

js 原型链 prototype __proto__

1.说明 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 2.prototype与__proto__区别 示例: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-w

js最好的继承机制:用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。

js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) {//在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性 ClassA.call(th

实践一些js中的prototype, __proto__, constructor

<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" type="text/css" href="ExtJs/

javascript原型链继承

一.关于javascript原型的基本概念: prototype属性:每个函数都一个prototype属性,这个属性指向函数的原型对象.原型对象主要用于共享实例中所包含的的属性和方法. constructor属性:每个原型对象都有一个constructor属性,这个constructor属性包含一个指向prototype属性所在函数的指针. 例如 Foo.prototype.constructor指向Foo函数.这个属性是只读的. __proto__属性(ES6通过对__proto__属性进行标