设为首页 加入收藏

TOP

浅谈JavaScript的面向对象思想(二)
2017-09-19 14:21:04 】 浏览:6493
Tags:浅谈 JavaScript 面向 对象 思想
);//true//共享同一个函数
 


缺点:它省略了为构造函数传递初始化参数,这在一定程序带来不便;另外,最主要是当对象的属性是引用类型时,它的值是不变的,总是引用同一个外部对象,所有实例对该对象的操作都会影响其它实例:



function Person() {
 }
Person.prototype.name = 'Rose';
Person.prototype.age = 18;
Person.prototype.lessons = ["语文","数学"];
Person.prototype.getName = function () {
    return this.name;
 };
var person1 = new Person();
person1.lessons.push("英语");
var person2 = new Person();
console.log(person1.lessons);//["语文", "数学", "英语"]
console.log(person2.lessons);//["语文", "数学", "英语"]//person1修改影响了person2
 


 


第六种:构造函数+原型方式(推荐)



function Person(name,age) {
    this.name = name;
    this.age = age;
 }
Person.prototype.getName = function () {
    return this.name;
 };
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定义的方法
 


缺点:属性定义在构造函数内,方法定义在构造函数外,与面向对象的封装思想不符。


第七种:构造函数+动态原型方式(推荐)


方式一:



function Person(name,age) {
    this.name = name;
    this.age = age;
    if (typeof Person._getName === "undefined"){
        Person.prototype.getName = function () {
            return this.name;
        };
        Person._getName = true;
    }
 }
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定义的方法
 


 


方式二:



function Person(name,age) {
    this.name = name;
    this.age = age;
    if (typeof this.getName !== "function"){
        Person.prototype.getName = function () {
            return this.name;
        };
    }
 }
var person1 = new Person('Rose', 18);
var person2 = new Person('Jack', 20);
console.log(person1.name);//Rose
console.log(person2.name);//Jack
console.log(person1.getName === person2.getName);//true//共享原型中定义的方法


 
 


对象属性的扩展及删除


java script的对象可以使用 ’.’ 操作符动态的扩展其属性,可以使用 ’delete’ 关键字或将属性的值设置为 ’undefined’ 来删除属性。



function Person(name,age) {
    this.name = name;
    this.age = age;
    if (typeof Person._getName === "undefined"){
        Person.prototype.getName = function () {
            return this.name;
        };
        Person._getName = true;
    }
 }
var person = new Person("Rose",18);
person.job = 'Engineer';//添加属性
console.log(person.job);//Engineer
delete person.job;//删除属性
console.log(person.job);//undefined//删除属性后值为undefined
person.age = undefined;//删除属性
console.log(person.age);//undefined//删除属性后值为undefined
 


对象属性类型


数据属性


特性:


[configurable]:表示能否使用delete操作符删除从而重新定义,或能否修改为访问器属性。默认为true;


[enumberable]:表示是否可通过for-in循环返回属性。默认true;


[writable]:表示是否可修改属性的值。默认true;


[value]:包含该属性的数据值。读取/写入都是该值。默认为undefined;如上面实例对象person中定义了name属性,其值为’My name’,对该值的修改都反正在这个位置



func

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java同步锁的正确使用 下一篇JSON字符串与JSON对象的相互转换

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目