JS面向对象设计(1)-理解对象

不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念,
它把对象定义为"无序属性(基本值、对象、函数)的集合",类似于散列表.
每个对象都是基于一个引用类型(原生类型、自定义类型)创建的.

1. 理解对象

创建自定义对象(Object构造函数、对象字面量).

// Object构造函数:创建一个Object实例,再为实例添加属性和方法.
var person = new Object();
person.name = "xiao";
person.getName = function() {
    console.log(this.name)      // 被解析为person.name
}

// 对象字面量: 属性在创建时带有一些特征值,JS通过特征值来定义它们的行为.
var person = {
    name: "xiao";
    getName: function() {
        console.log(this.name)
    }
}

1.1 属性类型(数据属性、访问器属性)

1.1.1 数据属性

  • [[Configurable]]可用delete删除属性从而重新定义属性,修改属性特性、改为访问器属性.
  • [[Enumberable]]可用for-in循环返回属性.
  • [[Writable]]可修改属性值.
  • [[Value]]属性的数据值,默认为undefined.

ps. 直接在对象上定义的属性,他们的Configurable,Enumberable,Writable特性都为true.

修改属性默认的特性:Object.defineProperty()

/*
* 参数
* 1.属性所在对象
* 2.属性名字
* 3.一个描述符对象,描述符对象的属性必须是(configurable、enumerable、writable、value)
*/
var person = {};
Object.defineProperty(person, "name", {
    writable: false,        // 属性只读
    value: "xiao"
})
console.log(person.name);   // "xiao"
person.name = "da";         // 非严格模式下被忽视,严格模式下报错
console.log(person.name);   // "xiao"
// 一旦属性定义为不可配置,将不能再把它变回可配置.
Object.defineProperty(person, "name", {
    configurable: false,    // 属性不可配置
    value: "xiao"
})

ps. 用Object.defineproperty()方法创建新属性,如果不指定,Configurable,Enumberable,Writable特性默认为false.

1.1.2 访问器属性

不包含数据值,包含一对getter、setter函数(都不是必需的)

  • [[Configurable]]可用delete删除属性从而重新定义属性,修改属性特性、改为数据属性.
  • [[Enumberable]]可用for-in循环返回属性.
  • [[Get]]读取属性时调用的函数,默认为undefined.
  • [[Set]]写入属性时调用的函数,默认为undefined.

ps. 访问器属性不能直接定义,必须使用Object.defineProperty()

// 常见使用方式:设置一个属性的值会导致其他属性发生变化
var book = {
    _year: 2018,            // 只能通过对象方法访问的属性
    edition: 1
};

Object.defineProperty(book, "year", {
    get: function() {           // __definGetter__
        return this._year;
    },
    set: function(newValue) {   // __definSetter__
        if (newValue > 2018) {
            this._year = newValue;
            this.edition += newValue - 2018;
        }
    }
});

book.year = 2019;           // 修改year属性会导致_year变成2019
console.log(book.edition);  // edition变成2

在不支持Object.definProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumberable]]

1.2 定义多个属性

Object.defineProperties()一次定义多个属性

/*
* 参数
* 1.要添加或修改其属性的对象
* 2.第二个对象的属性与第一个对象要添加或修改的属性一一对应
*/
var book = {};
Object.defineProperties(book, {
    _year: {
        writable: true,
        value: 2018
    },
    edition: {
        writable: true,
        value: 1
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            if (newValue > 2018) {
                this._year = newValue;
                this.edition += newValue - 2018;
            }
        }
    }
})

1.3 读取属性特性

Object.getOwnPropertyDescriptor()取得给定属性的描述符,返回值是一个对象(属性特有的特性)。

/*
* 参数
* 1.属性所在对象
* 2.要读取其描述符的属性名称
*/
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor.value);             // 2018
console.log(descriptor.configurable);      // false
console.log(descriptor.get);               // "undefined",是数据属性,不是访问器属性

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value);             // undefined,是访问器属性,不是数据属性
console.log(descriptor.configurable);      // false
console.log(descriptor.get);               // "function",是一个指向getter函数的指针

在JS中可以针对任何对象(包括DOM、BOM)使用Object.getOwnPropertyDescriptor()方法.

原文地址:https://www.cnblogs.com/LittlePANDA-ZSJ/p/10963990.html

时间: 2024-10-11 12:55:08

JS面向对象设计(1)-理解对象的相关文章

js框架设计1.2对象扩展笔记

需要一个新的功能添加到我们的命名空间上.这方法在JS中被叫做extend或者mixin,若是遍历属性用一下1.1代码,则会遍历不出原型方法,所以1.2介绍的是mass Framework里的mix方法. 类似juqery的$.extend(). 1.1代码 function extend(destination,source){ for(var property in source) destination[[property] = source[property]; return destin

03.JavaScript 面向对象精要--理解对象

JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次被添加给对象时JavaScript在对上上调用了一个名为 [[Put]]的内部方法,该方法会在对象上创建一个新节点保存属性,就像 哈希表上第一次添加一个键一样这个操作不仅指定了初始值 也定义了属性的一些特征 1.1 [[Put]]内部方法 [[Put]]在对象上创建一个自有属性 1.2 [[Set]

js面向对象设计之function类

/*本文并非是介绍JavaScript的原型的原理的文章, **仅仅讨论function作为类来使用时如何近似传统的面向对象设计 **/ /*function作为类的用法 **下面是一个最简单的类 **实例将有自己的属性val和pVal,也有方法printVal和pMethod **/ function Class01( val, pVal ) { this.val = val; /*实例可直接读写的属性*/ var pVal = pVal; /*实例无法直接读写的属性*/ } Class01.

面向对象的程序设计-理解对象

理解对象 创建自定义对象的最简单方式就是创建一个Object的实例,然后再为它添加属性和方法 1 var person = new Object(); 2 person.name = "Nicholas"; 3 person.age = 29; 4 person.job = "SoftWare Engineer"; 5 person.sayName = function(){ 6 alert(this.name); 7 }; 创建对象的首选模式是对象字面量方式 1

js面向对象系列——Function函数对象

Function到底是什么东西? 1. Function是最顶层的构造器,它构造了系统中所有的对象,包括Object(Object是最顶层的对象,但要明确的知道Object也是一个函数,也是有Function构成的),Array,Date等 2. 一切都是对象,所以理论上理解Function也是一个对象,我们可以称为函数对象 这里简单介绍一下另一个重要的工具:instanceof 作用:检验对象的类型 function TestObject(){} TestObject instanceof O

JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链解析)

1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = function () { console.log("Hello,my name is " + this.name) } } var P1 = new Person("Tom"); var P2 = new Person("Jim"); P1.sayHe

面向对象精要-理解对象

1.创建对象 创建对象的两种方法: 使用Object构造函数 var person2 = new Object(); person2.name="Qian"; 使用对象的字面形式 var person1={ name:"Qian" }; 对象添加以及修改时JavaScript会在对象上调用[[Put]]和[[Set]]方法 2.属性探测 2.1.使用“in”操作符 console.log("name" in person1)/*true*/ 2.

JS面向对象设计-创建对象

Object构造函数和对象字面量都可以用来创建单个对象,但是在创建多个对象时,会产生大量重复代码. 1.工厂模式 工厂模式抽象了创建具体对象的过程.由于ECMAScript无法创建类,我们用函数来封装以特定接口创建对象的细节. function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { console.

javascript面向对象系列1——理解对象

[对象定义]无序属性的集合,其属性可以包含基本值.对象或者函数 //简单的对象实例 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); } [内部属性类型]内部属性无法直接访问,ECMAScript5把它们放在两对方括号