JavaScript高级程序设计——第6章 理解对象

《JavaScript高级程序设计》读书笔记 【1~7章】 文章目录1.Javascript简介1.1. ECMAScript1.1.1. ECMAScript简介1.1.2. ECMAScript兼容1.2. 文档对象类型DOM1.2.1. DOM简介1.2.2. DOM级别1.2.3. 其他DOM标准1.3. 浏览器对象类型BOM2. HTML中使用JavaScript2.1. < script >元素3. 基本概念3.1. 语法3.2. 数据类型3.3. 流控制语句3.4. 理解函数 1.Javascript简介 JavaScript是一种专为与网 阅读详情
ECMA-262对对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数。

6.1 理解对象

创建对象

//早起创建对象方法
var person = new Object();
person.name = "Greg";
person.age = 29;
person.sayName = function(){
    console.log(this.name);
};

//字面量方法

var person = {
    name:"Greg",
    age:29,
    sayName:function(){
        console.log(this.name);
    }
}; 
6.1.1属性类型

只有内部才用的特性。规范:例如[[Enumerable]]

数据属性

  • 数据属性包含一个数据值的位置,在这个位置可以读取和写入值。
特性描述
[[Enumerable]]能否通过for-in循环返回属性,例子中直接在对象上定义的属性,默认true
[[Configurable]]能否通过delete删除属性从而重新定义属性,能否修改属性特性,能否把属性修改为访问器属性,例子中直接在对象上定义的属性,默认true
[[Writable]]能否修改属性的值,例子中直接在对象上定义的属性,默认true
[[Value]]包含这个属性的数据值,默认undefined

例如,前面person对象的name属性的数据属性分别是true,true,true,“Greg”。
* 修改属性默认的特性 Object.defineProperty(object,property,descriptor)

该函数接收三个参数:属性所在的对象、属性的名字和一个描述符对象。描述符对象的属性必须是enumerable、configurable、writable和value中的一个或多个。

var person = new Object();
Object.defineProperty(person,"name",{
    writable:false,
    value:"Jane"
});
person.age = 29;
person.sayName = function(){
    console.log(this.name);
};
person.sayName();  //Jane
person.name = "Greg";
person.sayName();  //Jane

如果尝试为name属性指定新值,非严格模式下,赋值被忽略;严格模式下,抛出错误。
注:可以多次修改同一属性,但是修改Configurable特性后,只能再修改writable特性。

访问器属性

  • 访问器属性不包含数据值,有一对getter和setter函数
特性描述
[[Enumerable]]能否通过for-in循环返回属性,例子中直接在对象上定义的属性,默认true
[[Configurable]]能否通过delete删除属性从而重新定义属性,能否修改属性特性,能否把属性修改为访问器属性,例子中直接在对象上定义的属性,默认true
[[Get]]读取属性时候调用的函数,默认undefined
[[Set]]写入属性时候调用的函数,默认undefined

* 访问器属性的定义:Object.defineProperty(object,property,descriptor)

//使用访问器属性常见方式:设置一个属性的值,导致其他属性发生变化
var book = {
    _year:2004, //只能通过对象方法访问的属性
    edition:1
};
Object.defineProperty(book,"year",{
    get:function(){
        return this._year;
    },
    set:function(newValue){
        if(newValue > 2004){
            this._year = newValue;
            this.edition += newValue-2004;
        }
    }
});
book.year = 2005;
console.log(book.edition); //2
6.1.2 定义多个属性

Object.defineProperties(object,properties)
该函数接收两个参数,第一个是要添加和修改其属性的对象;第二个对象的属性与要添加的修改的对象的属性一一对应。

var book = {};
Object.defineProperties(book,{
    //数据属性
    _year:{value:2004},
    edition:{value:1},
    //访问器属性
    year:{
        get: function () {
            return this._year;
        },
        set: function (newValue) {
            if (newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});
6.1.3 读取属性的特性

Object.getOwnPropertyDescription()接收两个参数:属性所在的对象和要读取其描述符的属性名称。

var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
console.log(descriptor.value);         //2004
console.log(descriptor.configurable);  //false

6.2 创建对象

6.2.1 工厂模式

用函数来封装以特定接口创建对象的细节。

function createPerson(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        console.log(this.name);
    };
    return o;
}
var person1 = createPerson("Jane",29,"teacher");

弊端:没有解决对象识别问题(怎样知道一个对象的类型)

6.2.2 构造函数模式
function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        console.log(this.name);
    };
}
var person1 = new Person("Jack",23,"worker");
var person2 = new Person("Tom",23,"actor");

与上面一种方法比较:
* 没有显式地创建对象,
* 直接将属性和方法赋给this
* 没有return语句
* 创建实例的时候需要用new操作符

弊端:每个方法都要在每个实例上创建一遍,比如上面的person1和person2的sayName是不相等的。有this属性在,没必要在执行代码前面就把函数绑定到特定对象上面。如果把函数定义转移到构造函数外部,又影响封装性。

6.2.3 原型模式

创建的每个函数都有一个prototype属性,该属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

function Person(){}
Person.prototype.name = "Tom";
Person.prototype.age = 23;
Person.prototype.sayName = function(){
    console.log(this.name);
};
var person1 = new Person();
person1.sayName();  //Tom
var person2 = new Person();
person2.sayName();  //Tom
console.log(person1.sayName == person2.sayName);  //true
  • 原型对象

任何时候创建一个新函数时,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象。默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。调用函数创建一个新的实例,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ES5称之为[[Prototype]]。

image.png
①Person.prototype指向原型对象
②Person.prototype.constructor指回Person
③Person的每个实例的内部属性只指向Person.prototype,实例与构造函数没有直接关系

确定对象和原型之间是否有关系,有以下两种方法

console.log(Person.prototype.isPrototypeOf(person1));             //true
console.log(Object.getPrototypeOf(person1) == Person.prototype); //true

每当代码读取一个对象的某个属性时,先搜索对象实例有没有这个属性,有就返回该属性的值;如果没找到,继续搜索指针指向的原型对象,若在原型对象找到该属性,则返回该属性的值。
注:不能通过对象实例重写原型中的值,实例中与原型对象重名的属性,会屏蔽原型的属性。

person1.name = "Jack";
person1.sayName(); //Jack——来自实例
person2.sayName(); //Tom——来自原型

使用delete可以完全删除实例属性,同时原型属性不受影响

delete person1.name;
person1.sayName(); //Tom——来自原型

检测一个属性是否存在于实例中:hasOwnProperty()

console.log(person1.hasOwnProperty("name"));  //false
  • in操作符

单独的in操作符,property in object,通过对象能访问到属性,返回true。不管属性是存在于实例中,还是原型中。

person1.name = "Jack";
console.log("name" in person1); //true
delete person1.name;
console.log("name" in person1); //true

使用for-in循环:返回所有能通过对象访问的、可枚举的(enumerated)属性,包括存在在实例中、原型中的属性。屏蔽了原型中不可枚举的属性([[Enumerable]]标记为false)的实例属性也会在for-in中返回,因为开发人员定义的属性都是可枚举的。【此处IE有bug】
ES5中的Object.keys()方法接受一个参数对象,返回一个包含所有可枚举属性的字符串数组,Object.getOwnPropertyNames()获取所有属性。

function Person(){}
Person.prototype.name = "Tom";
Person.prototype.age = 23;
Person.prototype.sayName = function(){
    console.log(this.name);
};
var p1 = new Person();
p1.name = "Jack";
var key1 = Object.keys(Person.prototype); //[ 'name', 'age', 'sayName' ]
var key2 = Object.keys(p1);               //[ 'name' ]
var key3 = Object.getOwnPropertyNames(Person.prototype); //[ 'constructor', 'name', 'age', 'sayName' ]
                                                          //包括不可枚举的constructor
  • 更简单的原型属性
    对象字面量重写Person原型对象:
function Person(){}
Person.prototype = {
    name:"Tom",
    age:29,
    sayName:function(){
        console.log(this.name);
    }
};

注意,constructor不再指向Person,这里的语法本质上重写了prototype属性,constructor属性变成新的对象的constructor属性(指向Object)。instanceof操作符还能正确返回结果。

var friend = new Person();
console.log(friend instanceof Person);     //true
console.log(friend instanceof Object);    //true
console.log(friend.constructor == Object); //true
console.log(friend.constructor == Person); //false

可以让constructor重新指向Person:

function Person(){}
Person.prototype = {
    /************看这里*************/
    constructor:Person,
    name:"Tom",
    age:29,
    sayName:function(){
        console.log(this.name);
    }
};

以上方法会使constructor的[[Enumerable]]特性被设置为true。ES5兼容的浏览器可以这么干:

//重设构造函数
Object.defineProperty(Person.prototype,"constructor",{
    enumerable:false,
    value:Person
});
  • 原型的动态性

在原型中查找值的过程是一次搜索,对原型对象作出的任何修改能立刻从实例中反映出来。
* 原生对象的原型

所有原生引用类型(Object、Array、String…)都在其构造函数的原型上定义的方法。可以为原生对象的原型添加方法

  • 原型对象的问题

有时候共享属性不是我们想要的。比如向前文的Person.prototype添加:

friend:["Jane","Tod"];

对person1执行 person.friend.push(“Andy”); 结果同样反映到person2上。
解决方法:组合使用构造函数模式和原型模式
不希望(不需要)共享的属性,在构造函数中定义;constructor和共享的方法在原型中定义。
* 动态原型模式

function Person(name,age,job){
    //属性
    this.name = name;
    this.age = age;
    this.job = job;
    //方法
    if(typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            console.log(this.name);
        };
    }
}

方法部分的代码只在初次调用构造函数时执行
* 寄生构造函数模式

基本思想:创建一个函数,函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象。

function Person(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        console.log(this.name);
    };
    return o;
}
  • 稳妥构造函数模式

稳妥对象:没有公共属性,其方法也不引用this。适合在一些安全的环境中(禁用new和this)或者在防止数据被改动时使用。

function Person(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        console.log(name);
    };
    return o;
}

以上例子,除了sayName方法,没有其他办法访问name的值。

6.3 继承

ES只支持实现继承。

6.3.1 原型链
function SuperType(){
    this.property = true;
}
SuperType.prototype.getSuperValue = function(){
    return this.property;
};
function SubType(){
    this.prototype = false;
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
    return this.property;
};
var instance = new SubType();
console.log(instance.getSuperValue()); //true

关系图:

image.png
①实现的本质是重写原型对象。原本存在于SuperType的实例中的所有属性和方法,现在也存在于SubType.prototype中。
②property属性从SuperType“变到”SubType.prototype中。因为property是一个实例属性,getSuperValue是一个原型属性。SubType.prototype是SuperType的实例,那么property就位于该实例中。
③instance.constructor现在指向SuperType
④不能使用字面量方法重写SubType.prototype,会切断原型链
* 默认的原型

所有引用类型默认继承Object

image.png
* 确定原型和实例的关系

instanceof操作符、isPrototypeOf()方法:只要是原型链中出现过的原型,结果都返回true。

console.log(instance instanceof Object); //true
console.log(SuperType.prototype.isPrototypeOf(SubType.prototype)); //true
  • 原型链的问题:SuperType的实例属性会变成SubType.prototype的属性,同样有共享原型属性的问题。
6.3.2 借用构造函数

在子类型构造函数的内部调用超类型构造函数。使用apply()/call()在(将来)新创建的对象上执行构造函数。

function Product(name,price){
    this.name = name;
    this.price = price;
}
function Food(name,price){
    Product.call(this,name,price);
    this.category = "food";
}

//等同于
function Food(name, price) {
    this.name = name;
    this.price = price;
    this.category = 'food';
}

var f1 = new Food("apple",5.8);
var f2 = new Food("corn",3);
console.log(f1); //Food { name: 'apple', price: 5.8, category: 'food' }
console.log(f2); //Food { name: 'corn', price: 3, category: 'food' }
6.3.3 组合继承

使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承。【最常用】

function Product(name,price){
    this.name = name;
    this.price = price;
}
Product.prototype.printName = function(){
    console.log(this.name);
};
function Food(name,price){
    Product.call(this,name,price);//继承属性
    this.category = "food";
}
Food.prototype = new Product();//继承方法
Food.prototype.constructor = Product;
Food.prototype.printCategory = function(){
    console.log(this.category);
};
6.3.4 原型式继承

ES5的Object.create()

6.3.5 寄生式继承

创建一个仅用于封装继承过程的函数,在该函数内部以某种方式增强对象,最后返回对象。

function createAnother(original){
    var clone = object(original); //通过调用函数创建一个新对象
    clone.sayHi = function(){    //以某种方式增强这个对象
        console.log("Hi";)
    };
    return clone;                //返回对象
}
6.3.6 寄生组合式继承

组合继承中,调用了两次超类型构造函数,第二次调用时重写了实例属性。
寄生组合:借用构造函数继承属性,通过原型链的混成形式来继承方法。

function Product(name,price){
    this.name = name;
    this.price = price;
}
Product.prototype.printName = function(){
    console.log(this.name);
};
function Food(name,price){
    Product.call(this,name,price);//继承属性
    this.category = "food";
}
inheritPrototype(Food,Product);
Food.prototype.printCategory = function(){
    console.log(this.category);
};

function inheritPrototype(subType,superType){
    var prototype = Object(superType.prototype); //创建对象
    prototype.constructor = superType;           //增强对象
    subType.prototype = prototype;               //指定对象
}
打脸来的太快了,又发现一个Trae的宝藏功能--内置浏览器可以指定机型来显示前端界面 今天给大家分享一个Trae的实用功能,就是SOLO模式下内置浏览器可以指定不同的手机、平板机型来查看前端页面显示效果,我感觉这个功能很棒,忍不住就跟大家分享一下。 阅读详情

相关推荐

伯德图逆向工程:用MATLAB从扫频数据中提取系统特性的5个关键步骤

本文详细介绍了使用MATLAB从扫频数据中提取系统特性的5个关键步骤,包括数据预处理、频响特性提取、相位解缠绕、系统特性反演和结果验证。通过伯德图逆向工程技术,工程师可以有效分析黑箱系统的频率响应特性,解决噪声干扰和相位跳变等实际问题,提升控制系统调试效率。

weixin_29081163的博客 196

JS--改变函数中this的指向三种方法

function test(x, y){ console.log(x, y, this) } test() // 直接调用test,很显然this指向window let p = new test(3, 5); //new 实例化后:this指向构造函数 3, 5, test(){} // 基础: //一:bind test.bind(test, 33 , 22)(); //改变this,bind,生成一个新的函数,且this指向为第一个参数,其余参数为新函数的参数 //bind仅改变this,不会

weixin_43663775的博客 378

【UE 反射】反射的原理是什么?如何使用机制?

静态类型检查确保了类型的早期一致性和高效的代码执行,但减少了灵活性。动态类型检查提供了更大的灵活性,但增加了运行时的开销和潜在的错误。反射作为一种动态特性,无论是在静态类型语言还是动态类型语言中,都提供了强大的运行时类型操作能力,但也伴随着性能和安全性方面的权衡。通过理解这些联系,开发者可以在不同的编程语言和应用场景中选择适合的类型检查方式和反射机制,以实现所需的动态行为和灵活性,同时保证性能和安全性。

hhw_hhw的博客 6033

javascript中对象的属性的特性

1.ES5的属性特性包括下面六个:configurable: 表示能否通过delete来删除属性从而重新定义属性,能够修改属性的特性,默认为true enumberable: 表示是否能通过for-in循环返回属性。默认为true writable: 是否可以修改属性, 默认为true value: 包含这个属性的数据值。读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置。默认值为

赵圆圆 564

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7)

流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7)

qw225967的博客 7339

AFSim插件开发实战:从环境搭建到功能扩展

本文详细介绍了AFSim插件开发的完整流程,从环境搭建到功能扩展,涵盖了SDK配置、插件创建、核心代码解析、功能扩展实战、调试优化以及高级开发技巧。通过实战案例和实用技巧,帮助开发者快速掌握AFSim插件开发,提升仿真系统的扩展性和灵活性。

weixin_29309475的博客 577

关于不同对象且属性名称也不一样的两个对象之间的复制以及动态对象生成

最近遇到一个问题,要完成两个对象之间的复制,也就是根据对象A的属性值生成对应的对象B。其中A与B的属性名不同,但是其实是一个东西。前后交了不同的名字而已。因为会后很多的这样的情况,不可能每一个对象都写一个方法。我寻求一种通用的方法。网上找到BeanUtils.copyProperties()等方法copy对象要求属性名一致才可以复制。。研究了一天最后自己解决。特此贴出来给同样碰到此问题的同学们分享

qq_18630487的博客 4879

实战避坑:基恩士KV8000 PLC与C#上位机链路通讯全流程实现(含ST代码+上位机源码)

本文详细讲解了基恩士KV8000 PLC与C#上位机的TCP链路通讯实现,从PLC端的ST代码编写、通讯配置,到上位机的通讯类封装、界面实现,再到实战避坑和性能优化,提供了完整的可复用方案。该方案已在实际产线项目中验证,支持实时数据采集和控制指令下发,稳定性和可靠性满足工业场景需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1176

6.1.2 定义多个属性

bject.defineProperties() 方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一 个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。 var book = {}; Object.defineProperties(book, { _year: { value: 2004 }, edition: { va

前端菜鸟 302

文献综述三大痛点用AI轻松解决!借助Gemini 3 Pro搞定检索难、阅读慢、框架乱问题(附 AI 提示词)

4)“漏斗式”结构:先介绍宏观领域的研究现状,再缩小范围,聚焦于与你课题直接先关的子领域,深入探讨与你研究变量直接相关的文献, 指出前人没做过、没做全或结论有矛盾的地方,再顺势提出你的研究课题,这种结构逻辑最清晰,能直接引导读者发现你研究的必要性。想要有针对性的搜到相关文献,必须先把模糊的研究题目拆解成精准的检索语言,这个时候就需要建立一个关键词矩阵,如核心词、同义词、学术术语、上下位词,以及对应的英文表达。请围绕【我的研究主题/关键词】,检索近5年发表的高被引的中英文文献,优先选择顶刊综述/论文。

智能AI让学术科研更容易 277

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

Soly_kun的博客 414

JavaScript高级程序设计第三版 第6章 面向对象的程序设计 6.1 理解对象

6.1 理解对象6.1 理解对象6.1.1 属性类型数据属性和访问器属性Object.defineProperty()方法6.1.2 定义多个属性Object.defineProperties()方法6.1.3 读取属性的特性Object.getOwnPropertyDescriptor()方法 面向对象(Object-Oriented, OO)的语言有一个标志 面向对象(Object-Ori...

Hello 274

损失函数大汇总(四十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的边界优化损失函数,特别适用于小目标、细长结构和类别不平衡场景。它通过引入真实边界的有符号距离场(SDF),将边界距离优化问题转化为区域积分形式。与Dice Loss等区域重叠损失不同,Boundary Loss更关注预测边界与真实边界的精确对齐,而非整体区域重叠。其核心公式为像素级SDF值与预测概率的乘积求和,通过梯度调整使预测概率在真实边界内部升高、外部降低。该损失通常与区域型损失(如CE或Dice)联合使用,形成"区域分割+边界修正&qu

悦学共鸣,温柔以待,汇聚光芒,共同成长 354

读《javaScript高级程序设计-第6章》之理解对象

ECMA-262把对象定义为:无序属性的集合,其属性可以包含基本值、对象或函数。所以,我们可以理解对象就是名值对的集合,名就是对象的每个属性的名字,而每个名字都映射到一个值。 创建对象 创建对象有两种方式:方式一 var person=new Object(); person.name=“Jone”; person.age=20; per...

weixin_34315189的博客 93

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

0122-1-JavaScript高级程序设计11-27章

Promise.prototype.then()为Promise实例添加状态改变时的回调函数。

qq_24428851的博客 1208

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

全方位深入理解JavaScript面向对象

JavaScript面向对象程序设计 本文会碰到的知识点: 原型、原型链、函数对象、普通对象、继承 读完本文,可以学到 面向对象的基本概念 JavaScript对象属性 理解JavaScript中的函数对象与普通对象 理解prototype和proto 理解原型和原型链 详解原型链相关的Object方法 了解如何用ES5模拟类,以及各种方式的优缺点 了解如何用ES6实现面向对象 目录...

moyigg的博客 2万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

重学《JavaScript 高级程序设计》笔记 第6章对象

第6章 面向对象的程序设计 ECMAScript中没有类的概念; 1.创建对象-历史 1.1 创建实例,添加方法和属性 → 对象字面量 缺点: 使用同一接口创建很多对象,产生大量重复代码 var person = new Object() person.name = "Y" person.age = 18 person.job = "police" person.sayName = fu...

Stephy_Yy 195

《JavaScript高级程序设计》读书笔记 【8章~】【持更】

文章目录8. BOM8.1. window对象窗口位置窗口大小打开窗口间歇调用与超时调用系统对话框8.2. location对象查询字符串参数位置操作navigator对象检测插件8.3. screen对象8.4. history对象9. 客户端检测 8. BOM BOM提供了很多对象用于访问浏览器的功能。 8.1. window对象 在浏览器中,window是JavaScript访问浏览器窗口的接口,同时也是ECMAScript规定的Global对象。 作为全局对象,全局作用域中声明的变量与方法都是win

lemossrkilakila 384

前端红宝书《JavaScript高级程序设计》核心知识总结

此文是对《JavaScript 高级程序设计》一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解。摘要JS基本的数据类型和...

图灵教育 1534

JS高级程序设计 电子版下载介绍

JS高级程序设计 电子版下载介绍 【下载地址】JS高级程序设计电子版下载介绍 《JS高级程序设计》是一本深入探讨JavaScript语言的权威著作,全面覆盖了JavaScript的历史、核心概念、面向对象编程、函数式编程、异步编程、DOM操作及Ajax等关键技术。无论你是JavaScript初学者,还是希望提升技能的前端...

gitblog_06750的博客 1121

JavaScript高级程序设计 第6章 面向对象程序设计

目录6.1 理解对象6.1.1 属性类型6.1.2 定义多个属性6.1.3 读取属性的特性6.2 创建对象6.2.1 工厂模式6.2.2 构造函数模式6.2.3 原型模式6.2.4 组合使用构造函数和原型模式(广泛使用)6.2.5 动态原型模式6.2.6 寄生构造函数模式6.2.7 稳妥构造函数模式6.3 继承6.3.1 原型链6.3.2 借用构造函数6.3.3 组合继承(combination ...

蛋糕店的夏天 483

《JavaScript高级程序设计》总结——第6章:面向对象的程序设计

一、理解对象 1、属性类型 数据属性 作用:数据属性包含一个数据值的位置 特性:四个描述数据属性行为的特性: [[Configurable]]: [[Enumerable]]: [[Writable]]: [[Value]]: 访问器属性 2、定义多个属性 3、读取属性的特性 二、创建对象 1、两种普通模式 普通模式一:使用new 操作符创建 var person = new Ob...

是喵喵酱呀! 290

javascript高级程序设计pdf_Javascript高级程序设计第四版详细测评

本文视频版【红宝书】Javascript高级程序设计第四版详细测评_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com简介哈喽大家好, 我是大圣,上次做了一个js的书籍测评,评价还不错,在做css和node之前,再做几本书的详细推荐吧, 国庆今天又在家好好读了几本具有代表性的javascript高级程序设计【红宝书】javascript忍者秘籍你不知道的java...

weixin_39593744的博客 8872

JavaScript 高级程序设计 - 第 8 章 理解对象 学习笔记

本章内容量挺大的,因此笔记的话我也会分成 3-4 个部分去写,想要理解的细一点,顺便之后回顾的时候不会看的套类。本章主要就是了解一下和理解一下什么是对象,包括 Object 上的 properties 和 mixin。${this${this二者在实现上没有什么区别,只是后者使用 object literal(对象字面量)更加的方便简洁。

GoldenaArcher的博客 838

JavaScript高级程序设计_第6章笔记

JavaScript高级程序设计(第三版) 第6章 面向对象程序设计 这一章笔记比较特别,边看书边敲的代码,也直接敲出了笔记。看了两遍书。继承方式和C++还是不太一样。 核心就在于 构造函数,原型和实例的关系: 每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针 <!DOCTYPE html> <htm...

bx的博客 291

javascript高级程序设计第四版(javascript高级程序设计第四版)

如何学习 JavaScript 先说说学js的条件 论条件,咱是文科生,大学专业工商管理,和计算机毛关系都没;有人说英语,读了四年大学,很遗憾,咱还四级没混过;就咱这条件都学得乐呵呵的,您还等啥。 当然学习JS也是有门槛的,就是你的html和css至少还比较熟练,您不能连这东东是干啥的都不知道就开始上JS了,学乘除前...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 843
上一篇: JavaScript高级程序设计——第5章 引用类型
下一篇: JavaScript——第7章 函数表达式
扬扬羊
博客等级 码龄9年 11粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值