javascript Object.create()究竟发生了什么

  这是我在博客园的第一篇博客,早上看了一个大牛的博客,关于javascript继承的,对于大牛使用Object.create()实现继承的方式觉得点问题,就自己研究了一下,所以就有了这篇帖子。

本帖只讲Object.create()。因为我也才做一年前端,理解不对的,希望大牛们帮忙指正。

  在博客开始前先谈下我多 prototype和__proto__的粗浅的认识。

  1、prototype 只有类才有这个属性,一般通过函数声明 function xx(){} 和函数表达式 var xx=function(){} 定义的对象都有这个属性,而通过new生成的函数对象则没有这个属性。类的prototype属性指向类的原型对象

  2、__proto__  这个指向父类的prototype属性所指向的对象,即父类的原型对象; 函数声明和函数表达式定义的类的__proto__指向Object的原型对象function Empet(){}.比如 function A(){} ;  var a= new A(); a.__proto__===A.prototype;

  3、通过new 创建的对应是没有 prototype属性的

  先上一张图片,这样大家了解的比较清楚。图应该大家都看得懂,这里就不解释了。

  基于以上粗浅的认识开始下面的探讨。

  先创建类A

function A(){
    this.x="i am x"
}var a =new A();
console.log("A.prototype : "+A.prototype+" ,A.__proto__  : "+A.__proto__);//A.prototype : [object Object] ,A.__proto__  : function Empet(){}
console.log("a : "+a.prototype+" ,a.__proto__ : "+a.__proto__); //a : undefined ,a.__proto__ : [object Object]

  验证验证 a.__Proto__ 就是 A.prototype

a.__proto__.getName=function(){
	console.log("create by a.__proto__");
}
var a2 =new A();
a2.getName();  //create by a.__proto__

  验证成功,通过new创建的对象的__proto__跟类的prototype指向同一个对象,即类的原型对象

  现在开始正题——Object.create 发生了什么

var obj =Object.create(A);

  《javascript权威指南》6.1节中说 Object.create()创建一个新对象,其中第一个参数是对象的原型。

  如果按照这种说法 obj.prototype 应该指向A;所以obj.prototype跟A拥有相同的方法和属性,现在为A定义一个show方法 看obj.prototype是否能调用这个show()方法

A.show=function(){
    return "i am A"
}
console.log("A.show(): "+A.show());  //A.show(): i am A

  A能调用show方法,验证obj.prototype 是否能调用show()方法

console.log("obj.prototype: "+obj.prototype.show());//报错 undefined is not a function

  oh,mygod,难道我心中的圣经《javascript权威指南》上写的是错的吗?我宁可相信是我理解错了,或是翻译错了。

  经过断点调试发现,obj拥有__proto__属性而没有prototype属性。我前面也说过,在我粗浅的认识中, 只有通过new创建的对象才有这样的性质——有__proto__属性而没有prototype属性。所以我断定obj是通过new创建的对象。断点调试发现 obj的_proto__是指向A的。

  查阅了一下资料 微软的官方文档上是这样写的

  "Object.create()返回值为一个具有指定的内部原型且包含指定的属性(如果有)的新对象" 注意这里 "指定的内部原型" 指定的内部原型是__proto__ 而不是prototype。咦,难道真的是这样吗?

  如果是这样的话就是说  obj是new出来的对象, 在Object.create() 过程中 产生了一个类 这个类是obj的父类。父类new出了obj这个实例对象。 父类的prototype是指向A的, 所以obj的__proto__就指向了A。

  为了验证这个想法,程序走起。

console.log("obj.__proto__.show(): "+obj.__proto__.show()); //obj.__proto__.show(): i am A
console.log("obj.x : "+obj.x);  //undefined   oh soga。这个是正常的,因为A中定义x是this.x="i am x"  x是A实例的属性,obj报undefined是正常的

  obj的__proto__能够调用show()方法,说明obj的__proto__确实指向A  

  关于第二个验证obj.x是多余的。obj 本身没有x属性,沿着原型链 obj的prototype Object.create()创建的父类也没有定义x。obj的prototype的prototype也就是A,A函数里面有x,但是A本身没有定义x所以报undefined是正常的。果然基础不够扎实,才写了这多余的验证。

  再随便看下原型链继承。

A.x="gg";
console.log("obj.x A have defined x : "+obj.x); //obj.x A have defined x : gg

  果然跟想的一样,obj没有x,它就需找它的父类(obj_father),父类没有定义this.x,注意这里是this.x 而不是父类.x(obj_father.x)。在父类中只有this.x才能被子类调用。父类.x是父类自己的私有属性。父类没有x所以找到父类的prototype即A。A有.x 所以就输入A的x。没有A没有就报undefined;

  就刚刚突发奇想 想看一下new一个实例对象会产生什么后果。

var b= new obj();//object is not a function

  看到这个,我不得不嘲笑自己,本来就该这样,都不肯思考,还要写个程序验证!!!基础啊基础

  

  有理解不对的,希望大牛指正,不胜感激。

  

时间: 2024-08-08 01:28:15

javascript Object.create()究竟发生了什么的相关文章

Object.create(): the New Way to Create Objects in JavaScript

There are a lot of ways to create Objects in JavaScript, perhaps even more to integrate inheritance into them. Just when you thought that you've seen every possible way to create JS objects, I'm here to announce that there's yet another: the new Obje

[设计模式] JavaScript 之 原型模式 : Object.create 与 prototype

1. Object.create 1>. 定义: 创建一个可指定原型对象的并可以包含可选自定义属性的对象: 2> Object.create(proto [, properties]);  可选,用于配置新对象的属性; 1. proto: 要创建新对象的 原型,必须,可为 null; 这个 proto 要是已经创建的[new过],或 对象.prototype 才有价值; 2. properties: 可选,结构为: { propField: { value: 'val'|{}|function

javascript:利用Object.create()方法创建对象

在javascript里面,我们知道有两种常见的创建对象的方法,一种是使用对象直接量: 对象直接量是由若干值/键对组成的映射表,值/键对用逗号”,“分隔开,整个部分用花括号”{}“括起来. 例如: var empty={}; var people = { name:'kobe', age:'34' }; 另外一种方法是通过new创建对象:在new后面使用一个函数调用,这个函数也成为构造函数,通过new来初始化一个新的对象. 例如: var arr = new Array(); var date

javascript一种新的对象创建方式-Object.create()

原文地址:http://www.cnblogs.com/yupeng/p/3478069.html 1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传一个null,第二个参数是对象的属性描述符,这个参数是可选的. 例如: 1 function Car (desc) { 2 this.desc = desc; 3 this.col

js中的new操作符与Object.create()的作用与区别

js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 19:19:26 阅读数:1058 一.new 操作符 JavaScript 中 new 的机制实际上和面向类的语言完全不同. 在 JavaScript 中,构造函数只是一些使用 new 操作符时被调用的函数.它们并不会属于某个类,也不会实例化一个类.实际上,它们甚至都不能说是一种特殊的函数类型,它

使用Object.create()实现继承

一.常见继承方式 我们日常开发中常见的继承方式主要有: 1.默认模式: Child.prototype = new Parent(); 2.借用构造函数: function Child(a, b, c, d) { Parent.apply(this, arguments); } 3.借用和设置原型: function Child(a, b, c, d) { Parent.apply(this, arguments); } Child.prototype = new Parent(); 4.共享原

前端开发者进阶之ECMAScript新特性--Object.create

前端开发者进阶之ECMAScript新特性[一]--Object.create Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指定属性的对象 参数:prototype 必需.  要用作原型的对象. 可以为 null.descriptors 可选. 包含一个或多个属性描述符的 JavaScript 对象."数据属性"是可获取且可设置值的属性. 数据属性描述符包含 value 特性,以及 writable.enumerab

使用 Object.create 创建对象,super 关键字,class 关键字

ECMAScript 5 中引入了一个新方法:Object.create().可以调用这个方法来创建一个新对象.新对象的原型就是调用 create 方法时传入的第一个参数: var a = {a: 1}; // a ---> Object.prototype ---> null var b = Object.create(a); // b ---> a ---> Object.prototype ---> null console.log(b.a); // 1 (继承而来)

JavaScript Object对象

Object对象 1. 介绍 Object对象,是所有JavaScript对象的超类(基类).定义了Js对象的基本方法和属性. 2. 构造函数 2.1 new Object() :返回一个Object实例 2.2 new Object(value) :根据value的值,返回不同的对象(Number.Boolean.String) 参数: ①value {number | bool | string} :一个数字.布尔值或者字符串 返回值: {Number.Boolean.String} 返回一