关于 JS 中对象和类的理解

  • JS 中对象的种类 ?
  1. JS 内置的对象(如 Number 等)。
  2. 宿主环境对象(如 window,document 等)。
  3. 自己创建的对象 。
  • 在 JS 中怎么创建对象 ?

字面量形式创建对象(属性,方法,get,set 型属性)。

成员访问:两种访问方式(. [])。访问对象中没有的属性时,会返回 undefined。级联访问(对象里面嵌套对象)。

/* 字面量创建对象 */
var student = {
    // 属性
	'name': 'wuhao',
	'age': 22,
	// 方法
	'toString': function(){
		console.log('姓名:'+this.name+' 年龄: '+this.age);
	},
	// get 和 set 方法
	getName: function(){
		return this.name;
	},
	setName: function(val){
		this.name = val;
	},
	// 内部子对象
	self: {
		'name': 'my',
		'age': 18
	}
}
console.log(student.getName())
console.log(student['age'])
student.setName('wangwenyan')
console.log(student.name)
student.toString()
console.log(student['self']['name'])
console.log(student.self.age)

Object 函数创建对象,Object.defineProperty 定义与修改属性。Object.defineProperties 定义和修改多个属性。还可以用o.xxx='xxx' 或者 o['xxx']='xxx' 去新增属性。

/* Object创建对象 */
var o = new Object();// 内部已存在 toString 等内部方法
/* 使用 Object.defineProperty() 定义与修改单个属性 */
Object.defineProperty(o,'name',{value:'张三',writable:false})
console.log(o.name)
/* 使用 Object.ddefineProperties() 定义与修改多个属性 */
Object.defineProperties(o,{
	salary:{
		// get,set,writable,enuerable,comfigurable,value
		value:1000,
		writable:false
	},
	gender:{
		value:true
	},
	height:{
		get:function(){
			return 180
		},
		set:function(val){
			console.log(val)
		    }
	    }
})
console.log(o['salary'])
console.log(o['gender'])
o.age = 19
o['stuno'] = '1704240131'
console.log(o.age)
console.log(o.stuno)
console.log(o.height)
o.height=234

对象工厂方式(构造函数),创建对象。 

这里涉及到原型相关的知识

  • 每个函数都有 prototype 属性,指向它的原型对象。在使用构造函数创建的对象,有  __proto__  属性,指向它的原型对象。在原型对象中有 constrctor 属性,指向构造函数。
  • 在访问对象属性或者方法时,会先在创建的对象本身去找,如果没有找到的话,就会通过对象中的 __proto__  属性,访问在它的原型对象上去寻找。循环向上查找访问。
  • 在原型对象中,又包含 __proto__ 属性,可以指向它原型对象的上层原型对象,一直循环找,直到找到 Object 对象,原型指向为 null,为顶层。

【JS原型的作用】:可以把公共的属性和方法,加到原型对象中,新创建对象时,可以 节省内存空间。后续的 继承,基于原型,形成原型链去实现。

function Person(name,age){
    this.name = name;
    this.age = age;
    Person.prototype.toString = function(){
        console.log('姓名:' + this.name + ' 年龄: '+ this.age);
    }
}
var per = new Person('wuhao',21);
console.log(per.name)
console.log(per.age)
per.toString()
  • 自己实现 new ?
function Person(name, age){// Person 类
	this.name = name
	this.age = age
}
				
var person = new Person('wuhao',23)// 使用JS本身提供的 new
console.log(person.name)
console.log(person.age)
console.log(person instanceof Person)
				
function New(f){// f 是个构造器函数,形成闭包,f 和 var o = {"__proto__":f.prototype} 外部变量
   var o = {"__proto__":f.prototype}
   return function(){
	f.apply(o,arguments)// 对象中新增属性
	   return o
    }
}
var person1 = New(Person)('xiner',20)// 使用自己实现的 New
console.log(person1.name)
console.log(person1.age)
console.log(person1 instanceof Person)
  • JS 对象的基本操作 ?
  1. 成员的遍历: for(el in o),反射性遍历,无序。可以使用 Object.keys(o)  辅助排序,进行有序操作。
  2. 检查对象是否有某个值:'xxx' in o 或者 o.hasOwnProperty('xxx')
  3. 成员的删除:delete o.'xxx' ,有些属性是不能删除的 。
  • JS 对象成员特性 ?
  1. writable:规定是否可改写。
  2. enuerable:规定是否可枚举(决定遍历时是否出现)。
  3. configurable:规定是否可配置 。
  4. 通过 Object.getOwnPropertyDescriptor(o,'xxx') 得到自己属性的描述器。
  5. 类型判断:typeof 和 instanceof 。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值