定义
ECMAScript中没有类的概念,因此它的对象也于基于类的语言中的对象有所不同,因此js不是严格的面向对象的语言
对象是无序属性的集合,其属性可以包括基本值,函数和对象.
创建对象
1.直接创建(对象字面量)
结构:
var 变量名 = {
属性名1:值
属性名2:值
函数名:function(参数){
函数内容.... }
}
实例
var stu = {
name :'早安',
age: 24,
sex:'男',
sayHi: function(){
alert(this.name);
}
}
2. 对象构造函数
结构:
function 构造函数名(参数1,参数2){
this.属性名1 = 参数1;
this.属性名2 = 参数2;
this.函数名1 = function(){
函数内容.... }
}
实例
function student(name,age){
this.name = name;
this.age = age;
this.sayHi = function(name1){
console.log('我叫'+this.name);
}
}
var stu = new student('早安',20);
stu.sayHi();
3.稳妥的构造函数
实例
function Person(name,age){
var obj = new Object();
// 名义上的私有对象
obj.getName = function(){
return name;
}
obj.setName = function(nameNew){
name = nameNew;
}
return obj;
}
var person = Person('早安','20');
console.log(person.getName())
判断
1.typeof
typeof 运算符返回一个用来表示表达式的数据类型的字符串,判断一个变量是否是对象的方法
console.log(typeof 1); //number
var arr = [1,1,1]
console.log(typeof arr)// object 对象 引用类型
2.instanceof
instanceof 就是判断一个实例是否属于某种类,判断一个对象是否是引用类型
console.log(arr instanceof Object); //true
console.log(fn instanceof Object); //true
console.log(true instanceof Object); //false
原型
我们创建的每个函数都有一个prototype(原型属性),这个属性是一个指针,指向一个对象,而这个对象的用途是包含由特定类型的所有实例共享的属性和方法.prototype就是通过调用构造函数而创建的那个实例对象就是原型对象.使用原型对象的好处就是可以让所有的实例共享它所包含的属性和方法.
只要创建一个新函数,就会根据一组特定的规则为该函数创建一个porototype属性,这个属性指向函数的原型对象,在默认行情况下,所有的原型对象都会自动获得一个constructor(构造函数)的属性,这个属性包含一个指向prototype属性所在函数的指针.
实例
function student(name,age){
this.name = name;
this.age = age;
this.sayHi = function(name1){
console.log('我叫'+this.name);
}
//使用构造函数创建对象
}
student.prototype.sayAge= function(){
console.log('我的年龄是:'+ this.age);
}
//原型里面一般只添加函数
var student1 = new student('早安',22);
student1.sayAge();//我的年龄是:22
原型链
当要获取对象的某个属性值的时候
1.判断当前对象是否存在这个属性,如果有,就输出
2.如果第一步没获取到,就去构造函数的原型中找
3.如果找不到,就去object构造函数的原型里找
4.如果都没找到,就输出undefined
hasOwnPrototype
只能确定一个属性是不是对象自身的,如果一个属性在原型(prototype)中,就会返回false
in
in 关键字 判断一个属性是否在对象中
//判断一个属性在原型属性中是否存在
function hasPrototypeProperty(obj,name){
if((name in obj) && !obj.hasOwnProperty(name)){
return true;
}else{
return false
}
}