javascript面向对象(一)

  1 // 六:面向对象的程序设计
  2 // 什么是对象: “无序属性的集合,他们可以包含基本值,对象或者函数”,严格来说,就相当于一组没有特定顺序的值,每个对象和方法都有一个特定的名字,
  3 // 每个名字都映射一个值。
  4 // 每个对象都是一个基于引用类型创建。
  5
  6 // 一、属性类型(特性):数据属性和访问其属性  这些属性的特性是给jsvascript引擎用的,因此不是直接访问它们
  7 // 1.数据属性
  8 // [[Configurabale]]:表明能否delete删除属性从而重新定义属性;能否修改属性的特性或者能否把属性修改为访问
  9 //                     其属性:
 10 // [[Enumerable]]: 表示能都通过  for-in进行迭代
 11 // [[Writeble]]:能否修改属性的值
 12 // [[Value]]:  保存属性的值
 13
 14 // 要想修改上述属性的特性,必须使用ECMAScript 5规定的 Object.defineProperty() 方法;这个方法接受三个参数
 15 //     ①属性所在对象    ②属性的名称  ③一个描述符的对象,描述符特性必须以上四个中的一个或多个
 16
 17     var person = {};
 18     Object.defineProperty(person,"name",{
 19         //configurable:false,
 20         writable:false,
 21         value:"zhd"
 22     });
 23     person.name = ‘qi‘;  //由于writable的标记,此时是违法的 浏览器会忽略该句的执行,严格模式下报错
 24     //delete person.name;  //由于 configurable   该操作同样违法
 25     alert(person.name);  // zhd
 26
 27     // 并且一旦标记configurable = false,无法通过Object.defineProperty()将configurable 更改为false,
 28     // 一旦定义成不可配置类型的,就无法在将其改为可配置类型,此时在调用Object.defineProperty()修改除writable
 29     // 之外的特性,都会出错。
 30     // 也就是说 可以多次调用Object.defineProperty()修改同一属性,但是在configurable设置为flase,时,就会有
 31     // 限制
 32     //在调用Object.defineProperty()方法,如果不指定configurable,writable,Enumerable,则默认为false
 33     //(字面量创建对象时,默认为true)
 34
 35     //2.访问器属性(getter/setter)
 36     // [[Configurabale]]:表明能否delete删除属性从而重新定义属性;能否修改属性的特性或者能否把属性修改为访问器属性:
 37                         //直接在对象上定义的属性,这么属性值默认为true
 38     // [[Enumerable]]: 表示能都通过  for-in进行迭代 直接在对象上定义的属性,这么属性值默认为true
 39     // [[Get]]:读取属性 值      默认为undefined
 40     // [[Set]]: 写入属性 值      默认为undefined
 41     //访问器同样也只能使用Object.defineProperty() 来设定
 42     var book = {
 43         _year:2016,           //①
 44         edition:1
 45     };
 46     Object.defineProperty(book,"year",{
 47         get:function() {
 48             return this._year;          //②
 49         },
 50         set:function(newValue) {
 51             if(newValue > 2016){
 52                 this._year = newValue;          //③
 53                 //console.log(newVlaue);
 54                 this.edition += newValue - 2016;
 55             }
 56         }
 57     });
 58     book.year = 2017;
 59     //book._year = 2016; //浏览器会直接忽略
 60     alert(book.year);  //
 61     alert(book.edition); //2  意味着  设置一个属性的同时,也可以改变其他属性的值
 62
 63     //千万不要忘记 ②②③处的"_",忘记后就出现 Maximum call stack size exceeded 错误。
 64     //"_"用于表示只能通过对象方法访问的属性  _year为数据属性 year为访问器属性
 65     //直接访问 带"_"的属性, 浏览器就会直接忽略掉
 66     //与java 私有变量提供访问器类型,不过是将get/set方法变为了对year属性的访问来代替对 _year的访问
 67     //java:
 68     //int getYear(){ return _year;}                   person.getYear() ==> person.year;
 69     //void setYear(int value) {this._year = value;}   person.setYear(2) ==> person.year = 2;
 70     //不一定非要指定get/set方法:只有get时,属性只读;只有set时,属性只能写入
 71     //还有两个旧方法:
 72     book.__defineGetter__("year",function () {
 73         return this._year;
 74     });
 75     book.__defineSetter__("year",function(newValue){
 76         if(newValue > 2016){
 77             this._year = newValue;
 78             this.edition += newValue - 2016;
 79         }
 80     });
 81
 82     //定义多个属性  (在函数体内也可以直接地定义 get/set)
 83     var book = {};
 84     Object.defineProperties(book,{
 85         _year:{
 86             value:2016
 87         },
 88         edition:{
 89             value:1
 90         },
 91         year:{
 92             get:function(){
 93                 return this._year;
 94             },
 95             set:function(newValue){
 96                 if(newValue > 2016){
 97                     this._year = newValue;
 98                     this.edition += newValue - 2016;
 99                 }
100             }
101         }
102     });
103
104
105     //读取对象属性的特性 返回值时一个对象
106     //如果是数据属性,则有configurable,enumerable,writable和value
107     //如果是访问器属性则有 configurable,enumerable,set和get
108     //访问数据属性
109     var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
110     alert(descriptor.value); //2016
111     alert(descriptor.configurable); //false
112     //alert(type descriptor.get); //"undefined"
113     //访问访问器属性
114     var descriptor = Object.getOwnPropertyDescriptor(book,"year");
115     alert(descriptor.value); //undefined
116     alert(descriptor.enumerable); //false
117     alert(typeof descriptor.get); //"function"
118     alert(descriptor.get); //会返回代码
时间: 2024-08-17 19:54:09

javascript面向对象(一)的相关文章

JavaScript面向对象及相关知识

最近在学习JavaScript面向对象,写下自己的理解及相关资料,以备查阅. 一.面向对象中涉及的相关几个概念 1.作用域 所谓作用域,就是说属性和函数的可访问范围.在JavaScript中,作用域分为两种.全局作用域和局部作用域. 所有没有var 声明 或 定义于最外层函数和最外层函数外面即为全局作用域.也就是定义可以随意调用. 自定义函数内部用var声明的为局部作用域. var num = 1; //全局作用域 window.onload = function() { //最外层为全局作用域

javascript面向对象之this指针

下午用面向对象的方法写一个幻灯片插件的时候不小心写出了这样的代码: Slider.prototype.auto=function() { setInterval(this.toRun,4000);//注意 } Slider.prototype.toRun=function() { if(this.iNow==this.aA.length - 1) ...... } 在浏览器打开的时候发现幻灯片不能如预期般自动切换,控制台给出了这样的错误提示: this.aA isundefined?然而我已经在

javascript面向对象2

原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user.sex = "男"; 上面呢创建了一个对象,当然创建对象的方法有很多种,但是用这样的方法创建对象比较简单直观,也是JavaScript种创建对象最基本的方法. 同时呢也出现了另外一个弊端,当我们想要创建多个对象的时候,我们就要写很多重复的代码,这样一来就增加了代码量,减少了工作的效率, 为

JavaScript面向对象之类的继承

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效:但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends.implement).为了实现这些面向对象的特性,需要额外编写一些代码,如下.

[连载]JavaScript讲义(03)--- JavaScript面向对象编程

[连载]JavaScript讲义(03)--- JavaScript面向对象编程,布布扣,bubuko.com

Javascript面向对象编程(二):构造函数的继承

这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数. function Cat(name,color){ this.name = name; this.color = col

Javascript 面向对象编程(一):封装

学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学习笔记,希望对大家学习这个部分有所帮助.我主要参考了以下两本书籍: <面向对象的Javascript>(Object-Oriented JavaScript) <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd

javascript面向对象系列第一篇——构造函数和原型对象

× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写 function Person(){ this.age = 30; } var person1 = new Person(); console.log(person1.ag

《Javascript面向对象精要》笔记

刚读过<Javascript面向对象精要>这本书,在现有的知识体系里面有一些新鲜的认识,记录一下. 原始类型和引用类型 Javascript存在两种类型:原始类型和引用类型.原始类型包括String.Number.Boolean.Null.Undefined,引用类型保存对象,其本质是对象所在内存位置的引用. 原始类型的赋值或者给函数传参,实际上都是传递原始类型值的拷贝: 引用类型则是引用的拷贝.修改其中一个引用的话,其他引用也会受到影响.如果对象中的某个属性也是对象,在对象拷贝时就会引入深拷