Object类型详解
来源:互联网 发布:域名被别人注册了 编辑:程序博客网 时间:2024/06/11 05:49
Object
1. 对象的创建,创建对象的七种方法
- 工厂模式
function createobject(names,age)
{
var obj=new Object();
obj.names=names;
obj.age=age;
return obj;
}
var cobj=createobject(‘sgm’,20);
用函数来封装以特定接口创建对象的细节,在函数中创建一个新对象并且赋值,然后返回这个对象 - 对象字面量
var obj={
name:’sgm’,
age:10
}; - 构造函数模式 constructor
任何函数,只要通过new操作符来调用,那么它就可以作为构造函数
优点:创建自定义的构造函数可以将它的实例标识为一种特定的类型
缺点:每个方法都要在每个实例上重新创建一遍
function Person(names,age)
{
this.names=names;
this.age=age;
}
var person1=new Person(‘sgm’,20);
/*
*创建一个新对象
*将构造函数的作用域赋给新对象
*执行构造函数中的代码
*返回新对象
*/ - 原型模式
*每个函数都有一个prototype属性,该属性是一个指针,指向一个对象
*用isPrototypeOf()来确定对象之间是否可以访问彼此的prototype属性
*使用hasOwnProperty()方法来检测一个属性是否来自原型
function Person(){};
Person.prototype.names=’sgm’;
Person.prototype.age=20;
Person.prototype.sayname=function(){
alert(this.names);
}
var person1=new Person();
person1.names=”lx”;
console.log(person1.names); //lx 来自于实例
console.log(person1.hasOwnProperty(“names”)); //true names属性存在于person1实例中,也就是person1有自己的names属性 动态原型模式 ,构造模式和原型模式相结合
*把所有信息都封装在构造函数中,通过在构造函数中初始化原型
*通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型
function Person(names,age,job){
this.names=names;
this.age=age;
this.job=job;
if(typedof this.sayName !=”function”){
Person.prototype.sayName=function(){
console.log(this.names);
};
}
}
var person1 = new Person(‘sgm’,20,’web’);
person1.sayName();寄生构造函数
创建一个函数,该函数的作用是封装创建对象的代码,然后返回新创建的对象
function Person(names,age,job){
var obj=new Object();
obj.names=names;
obj.age=age;
obj.job=job;
obj.sayName=function(){
console.log(this.names);
}
return obj;
}
2.对象的属性
- 属性名规则:可以是有效字符串或者任意可转换为有效字符串的类型
- 属性的访问和遍历
有obj.name和obj[name]两种方法访问属性
有for(var item in points)和object.keys(points).forEach(key)遍历
3.值和引用
- 值类型与引用类型
值类型:数值、布尔值、null、undefined
引用类型:对象、数组、函数
*把一个值类型传递给另一个变量时,其实是分配了一块新的内存空间,新分配的空间与其他的空间互不相关,值类型存储在栈区
*引用类型中,变量的交换其实是交换了指像同一个内容的地址,引用类型存储在堆区,不可以直接访问堆内存空间中的位置和操作堆内存空间,只能通过操作对象在栈内存中的引用地址,当变量赋值时,实际只是把这个堆内存对象在栈内存的引用地址复制了。对象通过指针指向的内存中的地址来做比较 - 基本类型对应的包装类型
- 对象的拷贝
*直接引用
*浅拷贝
如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能只是拷贝了基本类型的数据。浅拷贝只是拷贝了基本数据类型。
*深拷贝
能够实现真正意义上的引用类型的拷贝,递归拷贝引用类型
function deepCopy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === ‘object’) {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
4.类型和构造器
- new和constructor
每个构造器都有prototype属性,这个属性的结构是字典,可以任意添加名-值对组合
js不支持类的概念,但它支持与对象一起用的特殊Constructor(构造器)函数。通过在构造器前面加new关键字,告诉js想使用构造器一样实例化一个新的对象,并且对象成员由该函数定义。在构造器内,关键字this引用新创建的对象。 - prototype
每个函数都有一个prototype属性,其所指向的对象带有constructor属性,这一属性指向函数自身
prototype(显式原型) 显式原型的作用:用来实现基于原型的继承与属性的共享。
[[prototype]](隐式原型)隐式原型的作用:构成原型链,同样用于实现基于原型的继承 - instanceOf
用instanceOf来检测某个对象是不是另一个对象的实例
instanceOf 可以在继承关系中用来判断一个实例是否属于它的父类型 - ES6 class
5.内置类型
Object
Function
Array
Date
Regex
Error
Math
ArrayBuffer
Promise
DataView
Map
Set
TypedArray
Proxy
6.对象的高级属性
*不建议修改Object.prototype和Array.prototype ,因为for…in的时候会将prototype上的方法也枚举出来,解决这个问题的方法:
- 不用for…in方法,用for或者Array.prototype.forEach
- 禁止往数组上添加方法
- 使用defineProperty(),enumerable默认为false
*getter和setter
Getters和Setters使你可以快速获取或设置一个对象的数据。一般来说,一个对象拥有两个方法,分别用于获取和设置某个值
一个对象内,每个变量只能有一个getter或setter
删除getter或setter的唯一方法是:delete object[name]
如果使用defineGetter或defineSetter,它会重写之前定义的相同名称的getter或setter
- Object类型详解
- [Object Pascal] String类型结构详解
- 【转】Oracle Object type 对象类型详解
- Object类型
- object类型
- object 详解
- Object详解
- Object 详解
- Object详解
- javascript 引用类型 - Object类型
- JavaScript引用类型--Object类型
- c#中的Object类型
- c#中的Object类型
- Object Pascal 中类型
- Object与基本类型
- object-c基本类型
- js中的object类型
- String[] Object类型转化
- 4.7.笔记
- string的用法以及cin用法
- JDK各版本之间的特性区别
- 安卓学习笔记--二
- 古怪的星号修饰符
- Object类型详解
- c++作业3
- mysql创建触发器
- ES6使用
- equals和==
- UVA
- 文章标题
- 基本运算符
- centos下theano以及CUDA的配置