`
azhangwq
  • 浏览: 5954 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

js对象创建过程【来自互联网】

 
阅读更多
【本文来自互联网】【目的是个人收藏】【欢迎大家指正错误】

JS中只有函数对象具备类的概念,因此要创建一个对象,必须使用函数对象。
JS中只有函数对象具备类的概念,因此要创建一个对象,必须使用函数对象。函数对象内部有[[Construct]]方法和[[Call]]方法,[[Construct]]用于构造对象,[[Call]]用于函数调用,只有使用new操作符时才触发[[Construct]]逻辑。
var obj=new Object(); 是使用内置的Object这个函数对象创建实例化对象obj。var obj={};和var obj=[];这种代码将由JS引擎触发Object和Array的构造过程。function fn(){}; var myObj=new fn();是使用用户定义的类型创建实例化对象。

new Fn(args)的创建过程如下(即函数对象的[[Construct]]方法处理逻辑,对象的创建过程)。另外函数对象本身的创建过程(指定义函数或者用Function创建一个函数对象等方式)虽然也使用了下面的处理逻辑,但有特殊的地方,后面再描述。
1. 创建一个build-in object对象obj并初始化
2. 如果Fn.prototype是Object类型,则将obj的内部[[Prototype]]设置为Fn.prototype,否则obj的[[Prototype]]将为其初始化值(即Object.prototype)
3. 将obj作为this,使用args参数调用Fn的内部[[Call]]方法
    3.1 内部[[Call]]方法创建当前执行上下文
    3.2 调用F的函数体
    3.3 销毁当前的执行上下文
    3.4 返回F函数体的返回值,如果F的函数体没有返回值则返回undefined
4. 如果[[Call]]的返回值是Object类型,则返回这个值,否则返回obj
注意步骤2中, prototype指对象显示的prototype属性,而[[Prototype]]则代表对象内部Prototype属性(隐式的)。
构成对象Prototype链的是内部隐式的[[Prototype]],而并非对象显示的prototype属性。显示的prototype只有在函数对象上才有意义,从上面的创建过程可以看到,函数的prototype被赋给派生对象隐式[[Prototype]]属性,这样根据Prototype规则,派生对象和函数的prototype对象之间才存在属性、方法的继承/共享关系。

用代码来做一些验证:
//Passed in FF2.0, IE7, Opera9.25, Safari3.0.4
function fn(){}
//the value of implicit [[Prototype]] property of those objects derived from fn will be assigned to fn.prototype
fn.prototype={ attr1:"aaa", attr2:"bbb"};
var obj=new fn();
document.write(obj.attr1 + "<br />"); //result: aaa
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj instanceof fn); //result: true
document.write("<br />");
//I change the prototype of fn here, so by the algorithm of Prototype the obj is no longer the instance of fn,
//but this won’t affect the obj and its [[Prototype]] property, and the obj still has attr1 and attr2 properties
  fn.prototype={};
document.write(obj.attr1 + "<br />"); //result: aaa
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj instanceof fn); //result: false关于创建过程返回值的验证:
//Passed in FF2.0, IE7, Opera9.25, Safari3.0.4
function fn(){
    //according to step 4 described above, 
    //the new fn() operation will return the object { attr1: 111, attr2: 222 }, it’s not an instance of fn!
    return { attr1: 111, attr2: 222 };
}
fn.prototype={ attr1:"aaa", attr2:"bbb"};
var obj=new fn();
document.write(obj.attr1 + "<br />"); //result: 111
document.write(obj.attr2 + "<br />"); //result: 222
document.write(obj instanceof fn); //result: false
分享到:
评论

相关推荐

    js 面向对象实例

    每个JavaScript对象都有一个`__proto__`属性,指向创建该对象的构造函数的原型。原型对象也是一个对象,可以通过`prototype`属性来访问。我们可以在原型上定义方法,这样所有实例都可以访问这些方法: ```...

    JavaScript面向对象编程指南

    JavaScript是一种广泛应用于Web开发的动态编程语言,尤其在构建交互式网页和富互联网应用程序时扮演着核心角色。在JavaScript中,面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它...

    javascript面向对象编程(中文)

    JavaScript是一种广泛应用于Web开发的动态编程语言,尤其在构建交互式网页和富互联网应用程序时扮演着核心角色。面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一种重要编程范式,它允许开发者...

    javascript面向对象教程

    无论是Web组件、富互联网应用(RIA)还是DOM操作,JavaScript的面向对象特性都能提供强大的工具。不断学习和探索JavaScript的这一面向对象层面,将有助于提升开发技能,应对不断变化的Web开发需求。

    JavaScript面向对象继承详解

    每个JavaScript对象都有一个内部的[[Prototype]]属性,通常可以通过`__proto__`或`Object.getPrototypeOf`访问。当试图访问对象的一个属性时,如果该属性不存在于当前对象,JavaScript会向上搜索原型链,直到找到该...

    JS编程实现-飞机大战游戏

    在IT领域,JavaScript(简称JS)作为一款强大的脚本语言,被广泛应用于网页动态效果的创建、Web应用程序的开发以及游戏制作等。今天,我们将深入探讨如何使用JS来实现一个经典的“飞机大战”游戏。这个游戏作为一个...

    Three.js是一个用于创建3D图形的JavaScript库

    Three.js 是一个基于 WebGL 的开源 JavaScript 库,专门用于在 Web 浏览器中创建和展示交互式的三维图形。WebGL 是一种在浏览器中实现硬件加速的图形渲染技术,它允许开发者无需插件就能在网页上实现复杂的3D图形...

    第4章--JavaScript对象.pptx

    创建JavaScript对象有多种方式,包括对象字面量模式、工厂模式、构造函数模式和原型模式。 - **对象字面量模式**是最简洁的创建对象的方法,直接定义键值对: ```javascript var person = { name: 'Nicholas', ...

    Web程序开发:第14章 JavaScript面向对象.pdf

    本章节涵盖了 JavaScript 中的面向对象编程(OOP)概念,包括创建对象、类和实例、继承、多态性等。下面是本章节的知识点总结: 创建对象 * 在 JavaScript 中,对象由特性(attribute)构成,特性可以是原始值,也...

    JavaScript面向对象编程(最终版).pdf

    JavaScript是一种基于对象的脚本语言,由Brendan Eich在1995年创造,并随着互联网的普及迅速成为了编写Web应用的主要语言之一。面向对象编程(Object-Oriented Programming,OOP)是编程范式的一种,该范式通过对象...

    javascript帮助文档(微软JS+w3cJS+核心版)

    W3CJS则是基于World Wide Web Consortium(W3C)的JavaScript标准规范,W3C是互联网技术的主要标准化组织。W3C的JavaScript文档强调了语言的标准化和跨平台一致性,涵盖了ECMAScript的语法、类型、对象、函数、事件...

    揭秘一线互联网企业 前端JavaScript高级面试视频课程

    本课程“揭秘一线互联网企业 前端JavaScript高级面试视频课程”聚焦于深入理解JavaScript,提升面试者在求职过程中的竞争力。 首先,我们来探讨JavaScript的基础知识。JavaScript是一种解释型、面向对象、弱类型的...

    js面向对象

    2. **原型**:每个JavaScript对象都有一个内部原型(__proto__),它链接到另一个对象,这个对象可以提供继承的属性和方法。`Person.prototype`可以添加共享的方法: ```javascript Person.prototype.greet = ...

    javascript,js帮助文档

    JavaScript,简称JS,是一种轻量级的解释型编程语言,广泛应用于网页和互联网应用开发。作为客户端脚本语言,它可以直接在用户的浏览器上运行,无需服务器支持,为网页添加交互性和动态功能。以下是对JavaScript的...

    Node.js-互联网的标准库

    标题 "Node.js-互联网的标准库" 指的是Node.js框架在构建互联网应用程序时所使用的内置标准库。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程,而且提供了丰富...

    JavaScript文件

    JavaScript是一种广泛应用于网页和互联网应用的编程语言,它主要负责为网页添加动态功能,与用户交互,以及处理数据。在JavaScript文件中,我们通常会看到各种语法、函数、对象和库的使用,这些都是构建现代Web应用...

    JavaScript设计模式与开发实践_himppf_js_jspremise_精通javascript_Js设计模式_

    创建型设计模式如单例模式、工厂模式、建造者模式等,关注对象的创建过程,确保在程序中只存在一个实例或者提供一个创建对象的接口。结构型模式如代理模式、装饰器模式、适配器模式等,关注如何组合和连接类与对象,...

    Javascript 高级程序设计(第3版)超清中文PDF

    JavaScript,作为一种广泛应用于Web开发的脚本语言,已经成为现代互联网技术不可或缺的一部分。《JavaScript高级程序设计》(第3版)是一本深入探讨该语言精髓的权威书籍,它为读者提供了全面且深入的JavaScript知识...

    使用XMLHttpRequest对象.doc

    在使用 XMLHttpRequest 对象发送请求和处理响应之前,必须先用 JavaScript 创建一个 XMLHttpRequest 对象。由于 XMLHttpRequest 不是一个 W3C 标准,所以可以采用多种方法使用 JavaScript 来创建 XMLHttpRequest 的...

Global site tag (gtag.js) - Google Analytics