首页  >  问答  >  正文

oop - javascript的对象,成员方法在原型中的定义错误

写法一代码如下:

// Javascript code
// 在原型中定义成员方法
function MyObject1() { 
	// 写法一
	MyObject1.prototype = { 
		test : function() { 
			window.alert('test_1');
		}
	};
}

function MyObject2() {
	// 写法二
	MyObject2.prototype.test = function() { 
		window.alert('test_2');
	};
}

// test
var o1 =  new MyObject1();
var o2 =  new MyObject2();
o1.test(); // 这个会报错:test is not a function
o2.test(); // 这个正常

写法一,在浏览器中会报错,说 o1.test is not a function,这是为什么呢?
写法二,则是正确的。
这两种写法有何不同?
最好是能找到官方的文档解释,先谢过。

迷茫迷茫2748 天前591

全部回复(3)我来回复

  • 天蓬老师

    天蓬老师2017-04-10 12:46:20

    正确的写法是

    function Object () {
      // blan blan blan
    }
    Object.prototype = {
        test: function () {
            // blan blan blan
        }
    };

    你没有弄清Javascript是如何通过构造函数来构建新的对象的。在调用new Object的时候,构造函数Object的prototype是{},为空对象。只有在该构造函数被执行一次后其原型才为{test: function () {}}。你可以尝试一下

    // Javascript code
    function Object() {
            Object.prototype =  { 
                    test : function() { 
                            window.alert('test');
                    }
            };
    }
    
    // test
    var o =  new Object();
    o = new Object();
    o.test();

    这时候test方法是存在的。
    还有一个注意点是,请不要使用Object作为构造函数的名称,因为Javascript原生构造函数中已经有Object

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 12:46:20

    原型链的概念理解错误
    MyObject1本身只是构造函数,不存在于原型链中。
    o1=new MyObject1() 创建了一个基于MyObject1.prototype的实例,MyObject1执行时又覆盖它。导致o1还是基于之前的那个原型。
    而MyObject2只是在原型上追加了一个method,所以没有问题。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 12:46:20

    你在创建MyObject1()的实例的时候,创建的MyObject1类型的实例对象是在重写MyObject1的prototype之前创建的,所以这个实例的原型实际上是原来的原型,不是你改写之后的原型,所以你调用不到test方法
    创建MyObject2的时候,实际上只是给MyObject2的原型添加了方法,没有重写原型,所以可以调用的到

    回复
    0
  • 取消回复