理解javascript 对象,原型对象、闭包

javascript作为一个面向对象的语言,理解 对象、原型、闭包、模块模式等技术点对于成为一名合格的javascript程序员相当重要,多年没写过blog,今天就先拋个玉,在下基本也不做前端,但颇感兴趣,愿意和大家一起学习。此篇只是对自己认为的比较重要的知识点进行了说明,连贯性不是特别好,大家共同进步。

注意:文中中文并非英文翻译,只是个人理解。

理解面向对象

对象(object)

An object is a collection of properties and has a single prototype object. The prototype may be the null value

无序属性的集合,其属性可以包含基本值、对象或者函数。

Prototype

       object that provides shared properties for other objects。

为其他对象提供属性的对象。

属性分为数据属性和访问器属性。

数据属性

Attribute Name


Value Domain


Description


[[Value]]


Any ECMAScript language type


The value retrieved by a get access of the property.

可以通过属性获取值


[[Writable]]


Boolean


If false, attempts by ECMAScript code to change the property‘s [[Value]] attribute using [[Set]] will not succeed.

默认true

如果是false,不能修改属性值


[[Enumerable]]


Boolean


If true, the property will be enumerated by a for-in enumeration (see 13.7.5). Otherwise, the property is said to be non-enumerable.

默认true

是否可以通过for in 返回属性值


[[Configurable]]


Boolean


If false, attempts to delete the property, change the property to be an accessor property, or change its attributes (other than [[Value]], or changing [[Writable]] to false) will fail.

默认是ture。

如果是false

通过delete删除属性,重新定义属性,把属性修改成访问器属性就会失败。

              Object.defineProperty ( O, P, Attributes )

The defineProperty function is used to add an own property and/or update the attributes of an existing own property of an object. When the defineProperty       function is called, the following steps are taken:

If Type(O) is not Object, throw a TypeError exception.

Let key be ? ToPropertyKey(P).

Let desc be ? ToPropertyDescriptor(Attributes).

Perform ? DefinePropertyOrThrow(O, key, desc).

Return O.

var Bird ={
    name:"poly"
};
console.log(Bird.name)
Object.defineProperty(Bird,"name",{
    writable:false,
    value:"poly"
})
console.log("before:"+Bird.name);
Bird.name="lily"
console.log("after:"+Bird.name);
访问器属性

Attribute Name


Value Domain


Description


[[Get]]


Object | Undefined


If the value is an Object it must be a function object.

读取属性时候调用该函数


[[Set]]


Object | Undefined


If the value is an Object it must be a function object.

写入属性时调用此函数


[[Enumerable]]


Boolean


If true, the property is to be enumerated by a for-in enumeration. Otherwise, the property is said to be non-enumerable.

可以通过for-in 循环返回属性。

默认值是true


[[Configurable]]


Boolean


If false, attempts to delete the property, change the property to be a data property, or change its attributes will fail.

可以通过delete 删除并修改属性。

var singal={
     _ip:"192.168.2.7",
     port:1111
 };

Object.defineProperty(singal,"ip",{

    get:function()
    {
         return this._ip;
    },
    set:function(value)
    {
         if(value!=1111)
         {
             this._ip = "192.168.1.7"
         }
    }
})
   singal.ip=1234
   console.log("ip:"+singal.ip);

理解原型对象

function Signal(){};

Signal.prototype.ip="192.168.0.7";
Signal.prototype.port =1111;
Signal.prototype.connect=function()
{
     console.log("connecting ...");
}

var singal_01 = new Signal();
var singal_02 = new Signal();
   singal_01.connect();
   singal_02.connect();

所有实例共享这些属性和方法。
console.log(singal_01.connect == singal_02.connect);//true

创建新函数,自动为该函数创建一个prototype属性(指针),这个属性指向函数的原型对象默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性的指针。

in

只要通过对象能够访问到属性就返回true

hasOwnProperty

只在属性存在于实例中返回True

使用delete 可以删除实例属性。

         原型对象缺点: 

1 省略了为构造函数传递初始化参数,所有实例默认值都相同

2. 对引用数据类型的属性造成修改后,所有实例都修改。

注意: 重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的联系。

闭包

       闭包是指有权访问另一个函数作用域中的变量的函数。

funcation add(x)
{
    return funcation(y)
    {
        console.log(x+y)
    }
}

当某个函数第一次调用时,会创建一个执行环境及相应的作用域链,并把作用域链赋值个一个特定的属性[scope]

对于闭包来说,内部函数会把外部函数的活动对象添加到自己的作用域中。

模块模型自认为特别重要,后期会专门写一篇和大家共同讨论。

    

时间: 2024-10-13 17:15:54

理解javascript 对象,原型对象、闭包的相关文章

深刻理解JavaScript基于原型的面向对象

主题一.原型 一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  "原型对象"是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性. 3 除了语言原生的顶级对象,每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统.root节点的顶层对象是一个语言原生的对象,其他所有对象都直接或间接继承它的属性. 显然,基于原型的语言比基于类的语言简单得多,我

如何理解JavaScript的原型和原型链

在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说,越来越依赖框架,离原生JavaScript越来越远,对基础知识的记忆和理解慢慢地模糊.淡忘. 而原型.原型链就是其中之一.每一个构造函数都有一个与之相关联的对象,该对象称之为原型对象.每个实例对象都能共享其原型对象上的属性和方法.原型对象的作用主要用来实现属性的继承,让实例对象能共享原型对象的属性

JavaScript中原型对象的彻底理解

一.什么是原型 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承. 1.1 函数的原型对象 ? 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 ).这个对象B就是函数A的原型对象,简称函数的原型.这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:c

全面理解Javascript中Function对象的属性和方法

函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这些属性和方法,这对于理解Javascript的继承机制具有一定的帮助. 属性(Properties) arguments 获取当前正在执行的 Function 对象的所有参数,是一个类似数组但不是数组的对象,说它类似数组是因为其具有数组一样的访问性质及方式,可以由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length.还有就是arguments对象存储的是实际传递给

JavaScript中原型对象的基本概念

在之前我们学习对象的时候,讲到了创建对象的方式,一个是通过构造函数创建一个新的对象,一个是对象字面量的方式创建对象. 讲到对象就必须要认识原型对象的概念了. 1 原型对象的概念 构造函数有一个默认的属性prototype属性,这个属性指向了一个对象,这个对象就是这个构造函数的原型对象了. 同时这个原型对象种有一个constructor属性,这个属性指向的是构造函数本身. 2 原型对象中的功能 原型对象中的属性和方法,可以被实例对象所共享(不同实例对象调用的原型函数中的属性和方法为同一个). 3

怎么理解js的原型对象

1. 所有对象都有原型对象. 2.  原型对象,就是其它语言中的类中的静态属性和静态方法,总是是静态-static就对了.原理是: 内存中只有一份. 内存中的图解: 先写个构造器: function Person(name, age) {     this.name = name;     this.age = age; } var A = new Person('A', 18); var B = new Person('B', 28); var C = new Person('C', 38);

js深入理解构造函数和原型对象

1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propotype chains)实现的.但在ES6中引入了类(class)这个概念,作为对象的模板,新的class写法知识让原型对象的写法更加清晰,这里不重点谈这个 2.首先我们来详细了解下什么是构造器 构造函数的特点: a:构造函数的首字母必须大写,用来区分于普通函数 b:内部使用的this对象,来指向即将要

__x__(63)0925第十天__ JavaScript 函数 上下文对象 原型对象

解析器在每次调用函数时,都会传递两个隐含参数: this    上下文对象 根据函数调用方式的不同,this 指向不同的对象 当作为普通函数调用时,this 指向全局对象 window 当作为对象的方法被调用时,this 指向调用该方法的对象 当作为构造函数调用时,this 指向创建的新对象 构造函数 出现的原因:由于目前为止,我们的对象都是用 new Object() 创建的,所以都是 Object 类的对象,不好区分...最好有个 Person 类,Animal 类 new Person()

理解JavaScript 的原型属性

1.原型继承 面向对象编程可以通过很多途径实现.其他的语言,比如 Java,使用基于类的模型实现: 类及对象实例区别对待.但在 JavaScript 中没有类的概念,取而代之的是一切皆对象.JavaScript 中的继承通过原型继承实现:一个对象直接从另一对象继承.对象中包含其继承体系中祖先的引用——对象的 prototype 属性. 2. JavaScript 实现继承的语言特性 当尝试访问 JavaScript 对象中不存在的属性时,解析器会查找匹配的对象原型.例如调用 car.toStri

简单理解javascript的原型prototype

原型和闭包是Js语言的难点,此文主要讲原型. 每一个方法都有一个属性是 prototype 每一个对象都有一个属性是 _proto_ 一旦定义了原型属性或原型方法,则所有通过该构造函数实例化出来的所有对象,都继承了这些原型属性和原型方法,这是通过内部的_proto_链来实现的. /* Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型.这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型. 每一个方法都有一个属性叫