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]

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

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

    

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

  1. 三张图较为好理解JavaScript的原型对象与原型链

    最近从网上看到别人详细得讲解了js的原型对象和原型链,看完感觉是看得最清晰的一个,于是,摘录到自己博客里 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与_ ...

  2. JavaScript中原型对象的应用!

    JavaScript中原型对象的应用! 扩展内置对象的方法 我以数组对象为例! // 原型对象的应用 扩展内置对象方法! Array.prototype.sum = function() { var ...

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

    在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说 ...

  4. Javascript深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...

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

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  6. JavaScript 的原型对象 Prototype

    在 JavaScript 中,每当定义一个对象(或函数)时候,对象中都会包含一些预定义的属性,其中一个属性就是原型对象 prototype. var myObject = function( name ...

  7. 三张图搞懂JavaScript的原型对象与原型链

    对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张 ...

  8. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

  9. [转]浅谈 JavaScript的原型对象与原型链

    看到这篇文章写的很好,转过来以便今后阅读. 原文地址:http://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼 ...

  10. JavaScript 之 原型对象、对象原型 —— { }

    JavaScript -- 构造函数 // 构造函数 function Player(name, age) { this.name = name; this.age = age; } JavaScri ...

随机推荐

  1. java.net.UnknownHostException 异常解决方案

    1)使用hostname命令设置新的host name与/etc/hosts本机hostname一致 #hostname 本机hostname 具体可以查看:/etc/hosts和//etc/sysc ...

  2. Jmeter实现MD5加密

    Jmeter3.0以后的版本不再内置MD5加密函数,只能自己写了. 1.编码 package com.liuke.test; import java.security.MessageDigest; i ...

  3. Centos7 安装keepalived实现高可用

    场景:尝试安装keepalived实现高可用,进而在suse环境中部署. 测试过程需要配合Nginx的相关知识:Centos7 Nginx安装 1 安装过程 问题 !!! OpenSSL is not ...

  4. HTML5 开发APP(头部和底部选项卡)

    我们开发app有一定固定的样式,比如头部和底部选项卡部分就是公共部分就比如我在做的app进来的主页面就像图片显示的那样 我们该怎么实现呢,实现我们应该建一个主页面index.html,然后建五个子页面 ...

  5. 关于vue组件的一个小结

    用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...

  6. reversing.kr easy crack 之write up

    之前学逆向感觉学得一踏糊涂,这阶段好多师傅带我,一定要好好学,重新开始,认真学习. 来看打开可执行文件: 用ollydbg载入,单步执行后停到了入口点: 分析入口点,并没有加壳,于是F9执行程序,跳出 ...

  7. hdu--1711--kmp应用在整形数组--Number Sequence

    /* Name: hdu--1711--Number Sequence Author: shen_渊 Date: 16/04/17 19:58 Description: 第一次知道,KMP能用在整形数 ...

  8. 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复

    开篇语 昨晚发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 然后上午起来吃完午饭之后,我就准备继续开工的,但是突然的,想要看B站.然后在一股 ...

  9. JavaScript 排序算法(JavaScript sorting algorithms)

    JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...

  10. Loadrunner 网页诊断图

    Loadrunner 11汉化后版本不包括网页诊断图,所以要想使用网页诊断图,不要汉化.12.50版本汉化后不受影响. 场景执行完,进行analysis时,才能打开网页诊断图. 网页诊断图中组件下载时 ...