内置对象
本地对象 Object、Array、String、Number、Boolean、Date、Error… 单体内置对象 只有 Global 和 Math 两者的区别: 单体对象不需要加new宿主对象
js寄宿环境定义的对象, eg:window、document、history自定义对象
格式:
typeof 数据
obj.name
方式二:对象名[属性]。obj["name"];
注意:如果属性名被保存在某一个变量,只能使用第二种方式。两种方式
对象名.属性名 = 属性值;
obj.mame = "zhangsan"
对象名[“属性名”] = 属性值;
obg["name"] = "zhangsan"
属性有四个特征
configurable:是否可以删除。默认为true。writable:是否可以修改属性的值。默认为true。enumerable:是否可以修改属性的值。默认为true。value:值。默认为undefined精细设置对象的属性
格式
Object.defineProperty(对象名,“属性名”,{ Configurable: Writable: Enumerable: Value: })示例:
案例:设置一个只读属性,模拟常量Object.keys();
输出结果:
输出结果:
结论:
对象的__proto__属性 指向 创建这个对象的函数的prototype
注意:
由于对象的__proto__[隐式原型]与创建这个对象的函数(构造器)的prototype是一致的。所以理论上,你对__proto__修改会直接影响prototype。建议只使用prototype[原型]答:谁调用了this就是谁。
看方法前的那个对象是谁,this就指向谁。
(1)有明确的对象
例如:Obj.say();say 的当前对象是obj,所以say中的this 就指向obj。(2)没有明确的对象
如果这个函数没有明确说是哪个对象的,则它肯定是属于window对象的,所以this就会指向window.(3)如果是call和apply的方式,这时,this指向第一个参数
例如:f.call(obj1),f中的this指向obj1。请参考
call,apply与bind的应用例子:矩形对象
优点:直接了当,yimuliao缺点:不能批量生产对象,只能一个一个写例子:
// 利用工厂模式创建对象 工厂利用一个函数来模拟 function factory(w,h){ // 批量地产生矩形对象 let obj = {} obj.width = w; obj.height = h; obj.getC = function(){ return (this.width+this.height)*2 } obj.getS = function(){ return this.width*this.height } return obj; } let r1 = factory(1,2) let r2 = factory(2,3) console.log(r1.getC()) // 6 console.log(r1.getS()) // 2 console.log(r2.getC()) // 10 console.log(r2.getS()) // 6优点:主要解决了字面量方式的不能批量生产对象的问题。
缺点:他产生的对象没有“商标”(不知道是谁生产的)
示例:
new做了如下四件事:
创建一个对象 var o = {};
F.call(o); // 先执行F()函数,同时把this用o来代替。把F()构造器设置的各种属性值,直接赋给o. 理解如下代码:
o.proto = F.prototype //让o具备F.prototype上定义的方法。
return o;
构造器模式优点:
解决了对象的来源不明的问题。我们可以通过对象的constructor属性,找到它的构造器。new 构造器() 这种格式会受面向对象的程序员(java,C#,C++…)所接受。具备工厂模式的批量生产(还可以是定制的,例如传参不同) 。构造器模式缺点:不能像数组一组,共用方法。内存浪费。
若有多个对象,多个对象指向同一个原型对象,parent,肯能存在干扰
每个对象各自独立,不存在干扰的现象
格式:
class 类名{ constructor(参数){ this.属性= 参数; } method(){//对象中简写方法,省略了function。不要与箭头函数搞混了。 } }注意:
class是关键字,后面紧跟类名,类名首字母大写,采取的是大驼峰命名法则。类名之后是{}。在{}中,不能直接写语句,只能写方法,方法不需要使用关键字方法和方法之间没有逗号。不是键值对。 例子: [外链图片转存失败(img-TAXlJqlA-1563964992735)(https://gitee.com/qyd_9/nodebook_image/raw/master/小书匠/201972403-js的面向对象724968d776daf62acfb0c2ac6d2d84e7724-4.png)]调用方式:
格式:
class 子类 extends 父类{ constructor(参数){ super(参数) this.属性 = 值 } }注意:
使用extends关键字来实现继承在子类中的构造器constructor中,必须要显式调用父类的super方法,如果不调用,则this不可用示例:
class NBAPlayer { constructor(name, age, height) { this.name = name this.age = age this.height = height } say() { console.log(`我是${this.name},今年${this.age},我的身高是${this.height}`) } jump() { console.log("jump...") } } class MVP extends NBAPlayer { constructor(name, age, height, year) { super(name, age, height) this.year = year; } showMVP() { console.log(`我是${this.name},我是${this.year}年的MVP`) } } var m1 = new MVP("xiaoqiang","33","191",2010) m1.say() m1.showMVP()