面向对象:
- 对象属性:数据属性和访问器属性;
数据属性:
Configurable:表示能否通过delete删除属性,
Enumberable:表示能否同过for-in循环返回属性;
Value:包含这个属性的值;
Writable表示能否修改属性的值;
方法:Object.defineProperty(); ie8一下不建议试用;
访问器属性:
- 创建对象
构造函数:按照惯例,构造函数始终应该以一个大写字母开头;
创造实例,必须试用new 操作符;
实例中都存在constructor属性,指向构造函数;
(注:多有对象都继承object, 所有实例也是object实例 instanceof);
构造函数作为普通函数调用,this为window;
3、原型模式:
创建一个新函数,函数就有prototype 属性,指向原型对象;
所有原型对象会自动获得一个constructor属性,属性指向prototype所在的函数指针;
IsprototypeOf();
//检测原型和实例是否存在关系 xx.prototype.isprototype(实例)-返回true,false;
Object.getPrototypeOf(实例);
//获取实例的原型 Object.getprototypeOf(实例) 返回原型对象;
兼容Ie9+
实例无法不能重写原型中的值,实例中出现同名的属性,会屏蔽原型中的属性;
例:
var person=function()
{};
person.prototype.name='wangxiao';
var person1=new person();
var person2=new person();
person1.name="xxxx";
alert(person1.name);//'xxxx'
alert(person2.name);//'wangxiao';
方法:hasOwnpropertype();检测是否是实例的属性;
var person=function()
{};
person.prototype.name='wangxiao';
var person1=new person();
var person2=new person();
person1.name="xxxx";
alert(person1.hasOwnProperty("name"));//true;person1自身的属性
alert(person2.hasOwnProperty('name'));//false;来自原型属性;
原型与in;
单独使用,in操作符会在通过对象能访问属性时返回true;
‘name’ in person1;
For-in循环中;
规定返回能够通过对象访问,可枚举的属性,不可枚举的属性屏蔽(包括原型中的属性);所有开发人员定义的属性都是可枚举的;
方法:Object.keys();//返回对象的可枚举属性;
Object.getOwnProtpertypeNames();//访问对象所有的属性(包括不可枚举的);
兼容ie9+等;
简单原型写法;
var person=function(){
this.name="wangxiao";
};
person.prototype={
age:'男',
like="xx"
};
问题:重新了原型,constructor指向object;
var person=function(){
this.name="wangxiao";
};
person.prototype={
constructor:person,
age:'男',
like="xx"
};
原型的动态性:
选型对象的任何修改会立即体现在是所有实例中;
例子:
Var firend=new person();
Person.ptototype.sayName=function(){ alert(‘xx’) }
Firend.sayName();//’xx’;
原型对象的问题:
Person.prototype.obj={}/[];
造成引用问题;
处理方式; 构造器原型组合模式
Var firend=new person(
This.obj={};
);
浙公网安备 33010602011771号