javascript中__proto__与prototype的关系及原型继承的原理

1.__proto__与prototype的关系

所有对象的__proto__都指向其构造器的prototype

var a = {"test":‘mico‘,"age":"18"};
var b = function(){};
var c = new Date();
var d = /^[\d]$/;

alert(a.__proto__ == Object.prototype); //true
alert(b.__proto__ == Function.prototype); //true
alert(c.__proto__ == Date.prototype); //true
alert(d.__proto__ == RegExp.prototype); //true

  

我们来看这样一段代码

var Test = function(){};//构造函数
Test.prototype.say = function(){
console.log(‘saying‘);
};

var t = new Test();

console.log(t);
alert(t.__proto__ === Test.prototype);//true

console可以看到:Test {}__proto__: Testconstructor: (){}arguments: nullcaller: nulllength: 0name: ""prototype: Test__proto__: Empty() {}<function scope>say: (){__proto__: Object

 打印出来的t是这个样子的,那么__proto__是什么。每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念,当找到这个对象的构造器的里面还没有这个属性,就会返回undefined。

		//原型链继承
 		var Base = function(){};

 		Base.prototype.say = function(){
 			alert("saying");
 		};

 		Base.prototype.getSaraly = function(){
 			alert("5000");
 		};

 		Base.prototype.name = "Mico";

 		var Ctrl = function(){};

 		Ctrl.prototype = new Base();

 		Ctrl.prototype.name = ‘敷衍啊‘;

 		var a = new Ctrl();
         console.log(a);
 		alert(a.name); //敷衍啊
 		a.say(); //saying
                alert(a.__proto__ == Ctrl.prototype);//true
                alert(a.__proto__.__proto__ == Base.prototype);//true

  

打印出来的a是这样的

可以看出,当打印a.name的时候,直接在__proto__里面找,找到了直接返回,

当打印a.saying的时候,在__proto__里面没有找到。就会再往下一层__proto__里面找,找到了直接返回,如果找到构造器的__proto__还没找到,返回undefined。

打印

  alert(a.__proto__ == Ctrl.prototype);//true
      alert(a.__proto__.__proto__ == Base.prototype);//true

这就是原型链的加成原理,__proto__是作为一个私有属性,而prototype是作为一个外部接口提供使用的,可以通过prototype来改变__proto__这个属性

时间: 2024-11-03 22:20:13

javascript中__proto__与prototype的关系及原型继承的原理的相关文章

JavaScript中__proto__与prototype的关系

一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ ==

JavaScript中__proto__与prototype的关系(转)

一.所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function) 1 2 3 4 5 6 7 8 9 Number.__proto__ === Function.prototype  // true Boolean.__proto__ === Function.prototype // true String.__proto__ === Function.prototype  // true Object.__proto__ ==

javaScript中__proto__与prototype的区别与联系

[转]javaScript中__proto__与prototype的区别与联系 2014-5-4阅读490 评论0 最近在学习javascript的原型,发现了__proto__与prototype,学问很大,于是研究了一下. 首先解释一下什么是原型? 原型是一个对象,其他对象可以通过它实现属性继承. 对象又是什么呢? 在javascript中,一个对象就是任何无序键值对的集合,如果它不是一个主数据类型(undefined,null,boolean,number,array,string),那它

JavaScript中的Array.prototype.slice.call()方法学习

JavaScript中的Array.prototype.slice.call(arguments)能将有length属性的对象转换为数组(特别注意: 这个对象一定要有length属性). 但有一个例外,IE下的节点集合它不能转换(因为IE下的dom对象是以com对象的形式实现,js对象和com对象不能进行转换) 首先,我们来看看JavaScript中的slice用法, 在JavaScript中Array是一个类,slice是此类中的一个方法,slice的中文意思是 '截取' 一个是String.

js中__proto__和prototype的区别和关系?

_proto__(隐式原型)与prototype(显式原型) 1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象.Note:通过Function.prototype.bind方法构造出来的函数是个例外,它没有prototype属性.(感谢 @陈禹鲁 同学的答案让我知道这一点) NOTE Function objects created using Function.prototy

[转载]js中__proto__和prototype的区别和关系

首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法. 2.方法(Function)方法这个特殊的对象,除了和其他对象一样有上述_proto_属性之外,还有自己特有的属性--原型属性(prototype),这个属性是一个指针,

理解js中__proto__和prototype的区别和关系

首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法. 2.方法(Function)方法这个特殊的对象,除了和其他对象一样有上述_proto_属性之外,还有自己特有的属性--原型属性(prototype),这个属性是一个指针,

js中__proto__和prototype的区别和联系

作者:苏墨橘来源:知乎 备注:本篇文章比较清楚的解释了__proto__属性.prototype.instanceof,秉持一贯风格,好文收藏,贴在这里供大家学习. __proto__(隐式原型)与prototype(显式原型) 1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象.Note:通过Function.prototype.bind方法构造出来的函数是个例外,它没有pro

Javascript中函数调用和this的关系

例子先行: var myObject={ foo:"bar", func:function(){ var self=this; console.log("outerfunc:this.foo="+this.foo); console.log("outerfunc:self.foo="+self.foo); (function(){ console.log("innerfunc:this.foo="+this.foo); con