直接经过构造函数建立一个新对象。安全
var obj = new Object() //等同于 var obj = {}
使用字面量的方式更简单,其实他俩是同样的。
优势是足够简单,缺点是每一个对象都是独立的。函数
function createObj(name,age){ var obj = {}; obj.name=name; obj.age=age; return obj } var Anson = createObj('Anson', 18) console.log(Anson) //{name: "Anson", age: 18}
优势是 能够解决建立多个类似对象的问题,缺点是 没法识别对象的类型。this
function Person(name,age){ this.name =name; this.age=age; this.sayName =function (){ alert(this.name) } } var person = new Person('小明',13); console.log(person); //Person {name: "小明", age: 13, sayName: ƒ}
优势是 能够建立特定类型的对象,缺点是 多个实例重复建立方法prototype
function Person(name, age){ this.name = name; this.age = age; Person.prototype.sayName = function (){ alert(this.name) } } var person = new Person('小白',18) console.log(person); //Person {name: "小白", age: 18} __proto__ -> sayName: ƒ ()
优势 多个实例引用一个原型上的方法 比较经常使用设计
function Person(name,age){ this.name=name this.age =age if(typeof this.sayName != 'function'){ Person.prototype.sayName = function(){ alert(this.name) } } } var person = new Person('小红',15) console.log(person); //Person {name: "小红", age: 15} 动态建立sayName: ƒ ()
优势 能够判断某个方法是否有效,来决定是否须要初始化原型,if只会在仅在碰到第一个实例调用方法
时会执行,此后全部实例共享此方法,须要注意的一点是,不能从新原型对象。code
function Person(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ console.log(this.name) } return o; } var friend=new Person("her",18,"Front-end Engineer"); friend.sayName(); //her
除了使用new
操做符,其余的和工厂函数同样,能够为对象建立构造函数。对象
function Person(name, age){ var o={}; o.sayName=function(){ alert(name) } return o; } var person = ('小亮',24); person.sayName();//’小亮‘
除了使用person.sayName()
以外 ,没有办法在访问到name的值,适合在某些安全执行环景下使用。继承
const person = { isHuman: false, printIntroduction: function () { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); } }; const me = Object.create(person); me.name = "Matthew"; // "name" is a property set on "me", but not on "person" me.isHuman = true; // inherited properties can be overwritten me.printIntroduction(); // expected output: "My name is Matthew. Am I human? true"
传入一个原型对象,建立一个新对象,使用现有的对象来提供新建立的对象的__proto__,实现继承。 ip
参考:《JavaScript高级程序设计第三版》、MDNget