对象是一组数据和方法的组合,在正规的面相对象语言中叫封装。在js当中对象是一种特殊的数据类型,其本身并不具备作用域的范围,她在整个作用域中参与运算。作用域规定了变量的可见范围,在es5及以下的es规范当中,js只有函数作用域和全局作用域。作用域主要是针对变量的执行环境,变量的搜索遵循,作用域链的嵌套关系。
对象的几种生成方式
-
属性追加
var obj = new Object() ;
obj.name = 'zhangsan' ;
obj.age = 22 ;
console.log(obj.name) ;
console.log(obj.age) ; -
工厂方式
function createObject()
{
let object = new Object() ;
object.name = 'zhangsan' ;
object.age = 22 ;
object.sayName = function(){
{
console.log(this.name) ;
}
return Object;
}
let obj1 = createObject();
let obj2 = createObject() ;
console.log(obj1.sayName(), obj2.sayName()) ; -
构造函数式
function Person(name, age)
{
this.name = name ;
this.age = age ;
this.sayName = function()
{
console.log(this.name);
}
}
let per1 = new Person('zangsan',22);
let per2 = new Person('lisi', 22) ;
per1.sayName(); //zhangsan
per2.sayName(); //lisi -
原型方式
function Person(){}
Person.prototype.name = 'zhangsan';
Person.prototype.sayName = function(){
console.log(this.name)
}
let person = new Person()
person.sayName() //zhangsan -
混合方式
function Person(name, age)
{
this.name = name ;
this.age = age ;
Person.prototype.sayName = function(){
{
console.log(this.name);
}
}
let person = new Person('zhangsan', 22) ;
person.sayName(); -
动态原型方式
function Person(name, age)
{
this.name = name ;
this.age = age ;
if(Person.flag = undefined)
{
Person.prototype.sayName = function(){
console.log(this.name);
}
}
}
let person = new Person('zhangsan', 22) ;
person.sayName() ; //zhangsan -
对象字面量方式
let person = .{
name : 'zhangsan',
age : 22,
sayName: function(){
console.log(this.name);
}
}
注意:在所有对象的定义方式当中,混合方式和对象字面量的方式是比较推崇的做法 。