原文地址:js面向对象学习笔记

一、对象概念

对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”。也就是一组名值对的无序集合。

对象的特性(不可直接访问),也就是属性包含两种,数据属性和访问器属性。

1、数据属性又包含

  • Configurable  //表示能否通过delete删除,默认为true;
  • Enumerable  //表示能否通过for-in循环返回属性,默认为true;
  • Writable     //表示能否修改属性的值,默认为true;
  • Value              //包含属性的数据值,默认为undefined

要修改默认属性的特性,必须使用ECMAscript5的object.defineProperty(属性的对象, 属性的名字, 需要修改的属性特性)方法。例如:

	// 1、修改默认的属性特性,
var person = {};
Object.defineProperty(person, "name", {
writable : false,
value : "abc"
}); alert(person.name); //abc
person.name = "bcd";
alert(person.name); //abc而不是bcd,这里在非严格模式下会忽略,在严格模式下会报错

一旦做了这样的设置之后,就不可再次修改了,否则就会报错。

	// 1、修改默认的属性特性,
var person = {};
Object.defineProperty(person, "name", {
writable : false,
value : "abc"
});
Object.defineProperty(person, "name", {
writable : true,
});

还有一点要注意的是,在调用Object.defineProperty()方法时,如果不指定第三个参数中的(Configurable,writable,Enumerable),也就是要修改的属性,那么他们都会默认为false

	// 1、修改默认的属性特性,
var person = {};
person.sex = "nan";
Object.defineProperty(person, "name", { //在这里我们修改name的值,不指定第三个参数中的属性,看结果
// writable : false,
value : "abc"
}); alert(person.name); //abc
person.name = "bcd";
alert(person.name); //abc,不可修改,默认为false
person.sex = "nv"; //没有调用defineProperty,默认还是为true
alert(person.sex); //nv

  

2、访问器属性

  • Configurable
  • enumerable
  • get                //在读取属性时调用的函数
  • set                //在写入属性时调用的函数
	// 2、定义访问器属性
var book = {
_year : 2014,
edition : 1
}
Object.defineProperty(book, 'year', { //year在这里就是定义访问器属性
get : function(){
return this._year;
},
set : function(value){
this._year = value;
this.edition += value-2004;
}
});
book.year = 2005;
alert(book.edition); // 2

当需要定义多个属性时,可以使用defineProperties(对象, 需要添加的属性);

	// 3、定义多个属性
var books = {}; Object.defineProperties(books, {
_year : {
value : 2004
},
edition : {
value : 1
},
year : {
get : function(){
return this._year;
},
set : function(value){
this._year = value;
this.edition += value-2004;
}
}
});
// books.year = 2006;
// alert(books._year); ////这里就不能用这个方法赋值了,这里返回2004
var descriptor = Object.getOwnPropertyDescriptor(books, "_year");
descriptor.value = 2006;
alert(descriptor.value); //2006
// alert(typeof descriptor.get);

这些概念似乎用的地方比较少,但是去理解js对象是很有作用的,基础嘛,基础永远是必须的,继续学习~

/*---------------------------------------------------------------------------------------------------------------------------------------*/

/*==========================================================================*/

(我发现等号分割线没上面短杠分割线好看)

二、创建对象

前几天看到这样的面试题,js创建对象的方法有几种,只知道是3种写法,并不清楚原理是什么,今天整理了下。

  1. 工厂模式
  2. 构造函数模式
  3. 原型模式
  4. 组合使用构造函数模式和原型模式

1、工厂模式

	// 4、工厂模式
function createPerson(name){
var obj = new Object();
obj.name = name; obj.show = function(){
alert(this.name);
}
return obj;
}
var person = createPerson("ym");//不需要使用new
person.show();

2、构造函数模式

构造函数的函数名大写开头,其他函数都是小写

	// 5、构造函数模式
function Person(name, sex){
this.name = name;
var sex = sex; //私有
this.show = function(){
alert(sex);
}
}
var person1 = new Person('ym', 'nan');
alert(person1.name); //ym
alert(person1.sex); //undefined
person1.show(); //nan

与工厂模式的区别:

  • 没有显示创建对象
  • 直接赋值给this对象
  • 没有return语句

构造函数的问题:

当对象有多个实例时,这些实例的所有方法都是不同的,因为它都会创建一遍。

	// 5、构造函数模式
function Person(name, sex){
this.name = name;
var sex = sex; //私有
this.show = function(){
alert(sex);
}
}
var person1 = new Person('ym', 'nan');
var person2 = new Person('jh', 'nv');
// alert(person1 instanceof Person); //true
alert(person1.show == person2.show); //false

 

3、原型模式

优点:可以让所有对象实例共享它所包含的属性和方法。

	// 6、原型模式
function Person2(){} Person2.prototype = {
name : "ym",
sex : 'nan',
show : function(){
alert(this.name);
}
} var a = new Person2();
var b = new Person2();
alert(a.show == b.show); //true

关于prototype,对它的理解也是非常重要的,过几天再学习整理,看了好多次了,觉得还是理解不够。

prototype是一个指针,指向一个对象,而这个对象就是包含所有实例共享的属性和方法,也就是说,通过调用构造函数而创建的那个对象实例的原型对象。

原型模式的问题:

	// 6、原型模式
function Person2(){} Person2.prototype = {
name : "ym",
sex : 'nan',
love : ['a', 'b'],
show : function(){
alert(this.name);
}
} var a = new Person2();
a.love.push('c');
var b = new Person2();
a.love.push('d');
// alert(a.show == b.show);
alert(a.love); //abcd
alert(b.love); //abcd

4、组合使用原型模式和构造函数模式

通过以上的例子我们可以知道,构造函数模式,创建的方法都是不同的,都是实例自己拥有的,而原型模式定义的属性和方法是共享的,那么结合起来使用真是perfect。

	// 6、混合模式
function Perfect(name, sex){
this.name = name;
this.sex = sex;
this.love = ['a' , 'b'];
} Perfect.prototype = {
constructor : Perfect,
show : function(){
alert(this.love);
}
}
var a = new Perfect('a', 'nan');
var b = new Perfect('b', 'nv');
a.love.push('c');
b.love.push('d');
a.show(); //abc
b.show(); //abd

总算是整理完了,我也理解了原来创建对象的3种方法就是上面说的前3点,但最好用的是第4种。

js面向对象学习 - 对象概念及创建对象的更多相关文章

  1. JS基础学习——对象

    JS基础学习--对象 什么是对象 对象object是JS的一种基本数据类型,除此之外还包括的基本数据类型有string.number.boolean.null.undefined.与其他数据类型不同的 ...

  2. js 面向对象 定义对象

    js面向对象看了很多,却没有完全真正的理解,总是停留在一定的阶段,这次再认真看一下. 面向对象包含两种:定义类或对象:继承机制:都是通过工厂模式,构造函数,原型链,混合方法这四个阶段,原理也一样,只是 ...

  3. js面向对象(对象/类/工厂模式/构造函数/公有和原型)

    https://www.cnblogs.com/sandraryan/ 什么是对象 js中一切都是对象(有行为和特征).js允许自定义对象,也提供了内建对象(string date math等) 对象 ...

  4. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...

  5. js面向对象学习笔记(四):对象的混合写法

    //对象的混合写法//1.构造函数function 构造函数() { this.属性}构造函数.原型.方法 = function () {};//调用var 对象1 = new 构造函数();对象1. ...

  6. js面向对象学习笔记(一):创建空对象,理解this指向

    var obj = new Object();//创建一个空对象 obj.name = '小王';//属性 obj.sayName = function () { //对象方法 对象最重要的是this ...

  7. js面向对象学习

    纯属笔记,加强记忆,不是教程,欢迎纠错,没有逻辑,不太适合学习使用. -------------- 继承多态等太多概念难以理解,还是从实践中慢慢学吧!争取能大致看懂网上的开源的代码. -------- ...

  8. js面向对象学习笔记(五):tab切换

    重点是this指向问题 <style> .hide{display: none;} #box div,#box1 div{display: none;} .hover{background ...

  9. js面向对象学习总结

    1.函数作为参数进行传递 function a(str,fun){ console.log(fun(str)) }; function up(str){ return str.toUpperCase( ...

随机推荐

  1. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  2. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  3. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  4. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  5. ABP文档 - 本地化

    文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...

  6. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  7. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  8. 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  9. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  10. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...