表现形式:
Var obj = {
xxx; xxx,
…
}
var pattern1 = {name: ‘xxx’}
var pattern2 = { name: ‘xxx’}
//name值并不是一个值,属于两个堆内存空间中
在单例设计模型中,obj不仅仅是对象名,它被称为”命名空间[NameSpace]”,
把描述事务的属性存放到命名空间中,多个命名空间是独立分开的,互不冲突
每一个命名空间都是js中Object这个内置基类的实例,而实例之间是相互对立不干扰的,所以我们称它为“单例”:单独的实例
如下图例子:
var nameSpace = (function () {
var n = 12
function fn () {}
return {
fn: fn
}
})
this:
function fn () {
console.log(1)
}
var obj = {fn:fn}
// 执行的是相同的方法,但是this指向不同
obj.fn(); // this=> obj
fn(); // this指向window
// 自执行函数,方法的this指向window
~function() {
// this => window
} ()
var n = 2;
var obj = {
n: 3,
fn:(function (n) {
n *= 2;
this.n += 2;
var n = 5;
return function(m) {
this.n *= 2;
console.log(m + (++n))
}
//自执行函数执行的时候,堆内存还没有存储完成键值对,和obj还没有关系,此时obj=undefined,obj.n会报错
})(n)
}
var fn = obj.fn
fn(3) // 9
obj.fn(3) // 10
console.log(n, obj.n) // 8 6
工厂模式(Factory Pattern)
function createPerson (name, age) {
var obj = {}
obj.name = name;
obj.age = age;
return obj
}
var p1 = createPerson('xxx', 25)
var p2 = createPerson('xxx', 25)
console.log()
面向对象编程,我们需要掌握“对象、类、实例”的概念
对象:万物皆对象
类: 对象的具体细分(按照功能特点进行分类:大类、小类)
实例:类中具体的一个事物(拿出类别中的具体一个实例进行研究,那么当前类别下的其他实例也具备这些特点和特征)
js中内置类
object 对象类 (基类)
Number数字类 String Boolean Null Undefined Array RegExp Function Date …
HTMLCollection 每一个元素集合都是它的实例
NodeList
EventTarget
Node: Element:HTMLBodyElement HTMLDivElement
WindowProperties: Window: window对象就是它的实例
基于基类,我们可以创建很多自己的类(自定义类)
function Fn() {}
var f1 = new Fn() //Fn是类 f1是类的一个实例
var f2 = new Fn() // f2也是Fn的一个实例
// f1和f2是独立的,互不影响
var obj = {}
var obj = new Object()
不管哪一种方式创造出来的都是Object类的实例,而实例之间是独立分开的,所以var xxx = {} 这种模式也是js中的单例模式.
var num1 = 12; // 数字类Number实例,数字类的特殊表达方式之一
var num2 = new Number(12); // 数字类的实例
console.log(typeof num1) // "number"
console.log(typeof num2) // "object"
普通函数执行:
普通函数执行流程如下图:
构造函数执行:
既有普通函数执行的一面,也有构造函数执行的一面
function Fn(name, age) {
var n = 10;
this.name = name;
this.age = age + n;
}
var f1 = new Fn('xxx', 20);
var f2 = new Fn('aaa', 30)
console.log(f1=== f2); // false:两个不同的实例(两个不同的堆内存地址)
console.log(f1.age) //30
console.log(f2.name) // 'aaa'
console.log('name' in f1) // true name和age在两个不同的实例都有存储,但是都是每个实例自己的私有属性
console.log(f1.n) // undefined 只有this.xxx =xxx 的才和实例有关系,n是私有作用域的一个私有变量而已
行参赋值、变量提升,都是私有变量
所以构造函数执行的时候,尽量减少return使用,防止覆盖实例
**
原型(prototype)、原型链(proto)
[函数]
普通函数、类(所有的类:内置类、自己创建的类)
[对象]
普通对象、数组、正则、Math
实例是对象类型的(除了基本类型的字面量创建的值)
prototype的值也是对象类型的
函数也是对象类型
…
原型链:
它是一种基于__proto__向上查找的机制。当我们操作实例的某个属性或者方法的时候,首先找自己空间中私有属性或者方法
function Fn() {
var n = 10;
this.AA = function () {
console.log('AA')
}
this.BB = function () {
console.log('BB')
}
}
Fn.prototype.AA = function () {
console.log('AA[公]')
};
var f1 = new Fn;
var f2 = new Fn